1. 程式人生 > >iOS開發—自定義NSOperation子類下載圖片

iOS開發—自定義NSOperation子類下載圖片

如果NSOperation的兩個子類,NSInvocationOperation類和NSBlockOperation類無法滿足需求,可以自定義一個繼承自NSOperation的類。接下來通過一個下載圖片的案例,展示如何使用自定義的NSOperation子類,這裡暫時先介紹非併發的NSOperation,具體內容如下:

(1)新建一個SingleViewApplication工程,命名為“11-CustomNSOperation”;

(2)進入Main.StoryBoard ,從物件庫中拖拽1個ImageView到程式介面,設定ImageView的Mode模式為Center,設定一個背景顏色,並且用拖拽的方式對這個控制元件進行屬性宣告;

(3)新建一個類DownloadOperation,繼承於NSOperation類,表示下載操作。在DownloadOperation.m檔案中,重寫main方法,並且為該自定義類建立一個代理,併為該代理提供一個下載圖片的方法,DownloadOperation類的宣告和實現檔案如下所示:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@class DownloadOperation;
//定義代理
@protocol DownloadOperationDelegate<NSObject>
//下載操作方法
-(void)downloadOperation:(DownloadOperation *)operation
image:(UIImage *)image;
@end
@interface DownloadOperation:NSOperation
//需要傳入圖片的URL
@property(nonatomic,strong) NSString *url;
//宣告代理屬性
@property(nonatomic,weak) id<DownloadOperationDelegate> delegate;
@end
#import"DownloadOperation.h"
@implementation DownloadOperation
-(void)main
{
    @autoreleasepool{
    //獲取下載圖片的URL
        NSURL *url=[NSURL URLWithString:self.url];
    //從網路下載圖片
        NSData *data=[NSData dataWithContentsOfURL:url];
    //生成影象
        UIImage *image=[UIImage imageWithData:data];
    //在主操作佇列通知呼叫方更新UI
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            NSLog(@"圖片下載完成……");
        if([self.delegate respondsToSelector:
            @selector(downloadOperation:image:)]){
            [self.delegate downloadOperation:self image:image];
        }
        }];
    }
}
@end
DownloadOperation.m檔案中,main方法實現了下載操作的功能,並通過downloadOperation:image:方法將下載好的圖片通過代理的方式傳遞給代理方。

在ViewController.m檔案中,建立NSOperationQueue佇列,設定ViewController成為DownloadOperation的代理物件,建立自定義操作,並將自定義操作物件新增到NSOperationQueue佇列中,最後重新整理介面,程式碼如下:

#import "ViewController.h"
#import "DownloadOperation.h"
@interface ViewController ()<DownloadOperationDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //建立佇列
    NSOperationQueue *queue=[[NSOperationQueue alloc] init];
    //佇列新增操作
    DownloadOperation *operation=[[DownloadOperation alloc] init];
    operation.delegate=self;
    [email protected]"https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1284235532,3794754795&fm=27&gp=0.jpg";
    //將下載操作新增到操作佇列中去
    [queue addOperation:operation];
}
-(void)downloadOperation:(DownloadOperation *)operation image:(UIImage *)image
{
    self.imageView.image=image;
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
執行程式,結果如下圖所示:


從圖中可以看出,自定義的NSOperation的子類同樣實現了圖片的下載操作。


相關推薦

iOS開發定義NSOperation下載圖片

如果NSOperation的兩個子類,NSInvocationOperation類和NSBlockOperation類無法滿足需求,可以自定義一個繼承自NSOperation的類。接下來通過一個下載圖片的案例,展示如何使用自定義的NSOperation子類,這裡暫時先介紹非

ios多執行緒操作(十二)—— 定義NSOperation實現網路下載後回撥

- (void)main { @autoreleasepool { // 下載圖片的耗時操作 NSURL *url = [NSURL URLWithString:self.urlString]; NSData *data = [NSDa

iOS開發-定義後臺顯示圖片 iOS7-Background Fetch的應用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

iOS開發-定義TabBarController新增跳轉控制器並且進行封裝(根據定義TabBar)

// //  ZZTabBarController.h //  ZZ_APP主流框架 // //  Created by ZZ_Macpro on 15/10/9. //  Copyright (c) 2015年 ZZ_Macpro. All rights rese

ios開發 定義日期選擇器 PTXDatePickerView

可能有一部分同學在專案中需要用到一個時間選擇器,又不想自己去自定義,那麼在這裡分享一個自定義的時間選擇器。可能直接用在你的專案中不合適,但可以給你提供參考,並快速自定義出一個時間選擇器。 首先描述下該

iOS開發-------定義回撥

       以前一直用系統寫的類,比如UIButton,用到的時候我們只需要知道用addTarget方法來回調,產生動作,但是卻不知道回撥是如何產生的,通過學習,自己寫了一個KeyBoard的類,大體執行結果就是,點選+1,內部有一個計數器count,會+1,當count

iOS開發-定義相機(仿微信)拍照、視訊錄製

網上有很多自定義相機的例子,這裡只是我臨時寫的一個小demo,僅供參考: 用到了下面幾個庫: #import <AVFoundation/AVFoundation.h> #import <AssetsLibrary/AssetsLibra

iOS開發多線程篇—定義NSOperation

一個 gate operation cti reserve RKE 新建 工廠 oar 一、實現一個簡單的tableView顯示效果 實現效果展示: 代碼示例(使用以前在主控制器中進行業務處理的方式) 1.新建一個項目,讓控制器繼承自UITableViewContro

iOS定義View實現layoutSubviews佈局控制元件

iOS開發中,- (void)layoutSubviews{}方法及相關方法注意點!! ==== ```objectivec - (void)creatAutoLayoutUSE { // 一、layout相關方法 } ``` - (void)layoutSubviews

定義EditText實現iOS風格搜尋框

最近在專案中有使用到搜尋框的地方,由於其樣式要求與iOS的UISearchBar的風格一致。預設情況下,搜尋圖示和文字是居中的,在獲取焦點的時候,圖示和文字左移。但是在Android是並沒有這樣的控制元件(可能見識少,並不知道有)。通常情況下我們使用組合控制元件

vue定義事件 組件把數據傳出去

orm currency prop targe 保留 eth counter href mat 每個 Vue 實例都實現了事件接口(Events interface),即: 使用 $on(eventName) 監聽事件 使用 $emit(eventName) 觸發事件

python利用企業微信api來進行發送定義報警的實現

python 微信報警python利用企業微信api來進行發送自定義報警的類實現企業微信註冊打開http://work.weixin.qq.com/企業微信主頁;點擊企業註冊;填寫相關信息,營業執照和註冊號可以不用填,直接下一步,按照提示操作即可;註冊完成後,登陸,就顯示如下界面:點擊我的企業標簽:看到如上界

小程序開發 定義轉發

高版本 獲取數據 目標 www. wsh message sce index 表示 請確認測試手機微信版本為最高版本 1,wxml (主要) <button open-type="share">分享</button> //<button o

Python web開發——定義userprofile(用戶描述)

描述 刪除 生成 需要 username ive image .com bsp 1、新建一個APP 2、查看數據庫中系統給我們提供的默認的users的字段含義 ID: 是主鍵,用戶的ID passWord:密碼 last_login : 最後一次登錄的時間 is

visio畫uml圖添加定義數據

otg tor sao 數據類型 cso pat mfc big arc tj35jh辜夢妒苑鄖肇http://www.docin.com/dour993jbllm0掣智彜苯狹克http://tushu.docin.com/sina_58492473393j9l2y坎譚蝕浪

模仿CyclicBarrier,定義自己屏障

on() exc urn oid lee rand () pri rup 簡介 在這裏模仿CyclicBarrier,自定義一個自己多線程屏障類,裏面有個計時器count,count為0時,才喚醒線程,否則就await掛起,(沒錯就是用的object類的掛起和喚醒全部線程方

定義數組

構造 增刪 del 個數 刪除數據 new err ray 重載 用類封裝一個數組以及對數組的增刪改查的操作。 源代碼: public class Myarray { private int[] array; //創建數組 private int e

spark定義udf輸入型為array報錯

定義 true 輸入 ref sca use oot lec 兩個 定義udf如下 val list2string = udf { (style: Array[String], num: Array[Long]) => style.zip(num).map(t

python全棧系列之---定義分頁

rip 當前 取數據 cep exce submit method next AI # coding:utf8 # __author: Administrator # date: 2018/3/7 0007 # /usr/bin/env python impo

java開發----定義對象,重寫equals方法

get ava string AI 擴展 hash date 方法重寫 int javaweb開發中,用到了好多自定義對象,這時候如果不重寫equals方法,很多時候都會返回false, 因此我們必須習慣重寫這個方法。 重點: 1.equals比較倆對象時比較的是對象