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,设置NSOperationqueue中的优先级,可以改变操作的执行优先级;

- (NSOperationQueuePriority)queuePriority;

- (void)setQueuePriority:(NSOperationQueuePriority)p;

2,优先级的取值;

(1)NSOperationQueuePriorityVeryLow = -8L;

(2)NSOperationQueuePriorityLow = -4L;

(3)NSOperationQueuePriorityNormal = 0;

(4)NSOperationQueuePriorityHigh = 4;

(5)NSOperationQueuePriorityVeryHigh = 8;


操作依赖:

1NSOperation之间可以设置依赖来保证执行顺序;

比如一定要让操作A执行完后,才能执行操作B,可以这么写

[operationB addDependency:operationA];  //操作B依赖于操作A

2,可以不同queueNSOperation之间创建依赖关系;


监听:

- (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];

            });

        }

    }

}




1 0
原创粉丝点击