NSOperation - 02
来源:互联网 发布:大众软件 pdf 编辑:程序博客网 时间:2024/06/05 23:44
NSOperationQueue作用:
NSOperation可以调用start方法来执行任务,但默认是同步执行的;如果将NSOperation添加到NSOperationQueue中,系统会自动异步执行NSOperation中的操作;
添加操作到NSOperationQueue中:
- (void)addOperation:(NSOperation *)p;
- (void)addOperationWithBlock:(void (^)(void))block;
最大并发数: 同时执行任务的最大数;开启新线程的最大数;
队列的取消、暂停、恢复:
取消操作:
- (void)cancelAllOperation; (队列方法,全部取消)
- (void)cancle; (操作方法,取消单个操作)
暂停和恢复:
- (void)setSuspended(BOOL)b; //YES代表暂停队列,NO代表恢复队列;
使用场景:在一个UITableView中,有加载数据图片的时候,当你滑动表单时,可以暂停队列任务,当你停止滑动,你就可以恢复队列任务;
操作优先级:
1,设置NSOperation在queue中的优先级,可以改变操作的执行优先级;
- (NSOperationQueuePriority)queuePriority;
- (void)setQueuePriority:(NSOperationQueuePriority)p;
2,优先级的取值;
(1)NSOperationQueuePriorityVeryLow = -8L;
(2)NSOperationQueuePriorityLow = -4L;
(3)NSOperationQueuePriorityNormal = 0;
(4)NSOperationQueuePriorityHigh = 4;
(5)NSOperationQueuePriorityVeryHigh = 8;
操作依赖:
1,NSOperation之间可以设置依赖来保证执行顺序;
比如一定要让操作A执行完后,才能执行操作B,可以这么写
[operationB addDependency:operationA]; //操作B依赖于操作A
2,可以不同queue的NSOperation之间创建依赖关系;
监听:
- (void)opeationListen
{
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i<10; i++) {
NSLog(@"NSBlockOperation------下载图片---%@", [NSThread currentThread]);
}
}];
operation.completionBlock = ^{
// ...下载完图片后想做事情
NSLog(@"NSBlockOperation------下载图片完毕---%@", [NSThread currentThread]);
};
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation];
}
自定义NSOperation:
当我们不想用系统给我们的Operation,我们可以自定义NSOperation,在下载图片的过程就可以用到;
1,重写 - (void)main函数;
注意:(1)因为如果void函数里面执行的是子线程(异步)操作,而autoreleasepool在主线程中,无法访问主线程的自动释放池,所以最好在- (void)main中创建一个@autoreleasepool{};
(2)经常通过-(BOOL)isCancelled方法检测操作是否被取消,对取消做出响应;
代码:
/**
* 在main方法中实现具体操作
*/
- (void)main
{
@autoreleasepool {
NSURL *downloadUrl = [NSURL URLWithString:self.url];
NSData *data = [NSData dataWithContentsOfURL:downloadUrl]; //这行会比较耗时
UIImage *image = [UIImage imageWithData:data];
if ([self.delegate respondsToSelector:@selector(downloadOperation:didFinishDownload:)]) {
dispatch_async(dispatch_get_main_queue(), ^{ //回到主线程, 传递图片数据给代理对象
[self.delegate downloadOperation:self didFinishDownload:image];
});
}
}
}
- NSOperation - 02
- NSOperation
- NsOperation
- NSOperation
- NSOperation
- NSOperation
- NSOperation
- NSOperation
- NSOperation
- NSOperation
- NSOperation
- NSOperation
- NSOperation
- NSOperation
- NSOperation
- NSOperation
- NSOperation
- NSOperation
- 单调队列
- 猫猫学iOS 之微博项目实战(4)微博自定义tabBar中间的添加按钮
- iOS中的一些小知识点
- UI____UIEvent以及响应者链
- 美国“懒人经济”风生水起
- NSOperation - 02
- Android 控件开发之Button
- 2.11-逻辑运算
- hadoop深入研究:(二)——java访问hdfs
- NYOJ —水池数目
- HDOJ 1232 畅通工程 (并查集)
- Android4.0强制横屏竖屏
- [iOS/Swift]String的 toInt() 和 integerValue 的区别
- 2.12-三目运算符