Objective-C的NSOperation多线程类基本使用指南

2020-01-14 19:04:47王旭

}];  
  
// 开始执行任务  
[operation start];  
打印信息如下:

 


2013-02-02 21:38:46.102 thread[4602:c07] 又执行了1个新的操作,线程:<NSThread: 0x7121d50>{name = (null), num = 1} 
2013-02-02 21:38:46.102 thread[4602:3f03] 又执行了1个新的操作,线程:<NSThread: 0x742e1d0>{name = (null), num = 5} 
2013-02-02 21:38:46.102 thread[4602:1b03] 执行第1次操作,线程:<NSThread: 0x742de50>{name = (null), num = 3} 
2013-02-02 21:38:46.102 thread[4602:1303] 又执行了1个新的操作,线程:<NSThread: 0x7157bf0>{name = (null), num = 4} 

可以看出,这4个block是并发执行的,也就是在不同线程中执行的,num属性可以看成是线程的id

四、自定义NSOperation
1.简介
如果NSInvocationOperation和NSBlockOperation对象不能满足需求, 你可以直接继承NSOperation, 并添加任何你想要的行为。继承所需的工作量主要取决于你要实现非并发还是并发的NSOperation。定义非并发的NSOperation要简单许多,只需要重载-(void)main这个方法,在这个方法里面执行主任务,并正确地响应取消事件; 对于并发NSOperation, 你必须重写NSOperation的多个基本方法进行实现(这里暂时先介绍非并发的NSOperation)

2.非并发的NSOperation
比如叫做DownloadOperation,用来下载图片
1> 继承NSOperation,重写main方法,执行主任务
DownloadOperation.h

复制代码
#import <Foundation/Foundation.h>  
@protocol DownloadOperationDelegate;  
  
@interface DownloadOperation : NSOperation  
// 图片的url路径  
@property (nonatomic, copy) NSString *imageUrl;  
// 代理  
@property (nonatomic, retain) id<DownloadOperationDelegate> delegate;  
  
- (id)initWithUrl:(NSString *)url delegate:(id<DownloadOperationDelegate>)delegate;  
@end  
复制代码   
// 图片下载的协议  
@protocol DownloadOperationDelegate <NSObject>