NSOperationQueue

来源:互联网 发布:mac不需要杀毒软件 编辑:程序博客网 时间:2024/05/17 20:30
- addDependency // method APIMakes the receiver dependent on the completion of the specified operation.让消息的接收者依赖在指定操作完成时。The receiver is not considered ready to execute until all of its dependent operations have finished executing. 接收者不会准备执行直到它所依赖的操作执行完成If the receiver is already executing its task, adding dependencies has no practical effect.如果接收者早已经执行了任务,那么添加依赖就没有什么实际的影响。It is a programmer error to create any circular dependencies among a set of operations. Doing so can cause a deadlock among the operations and may freeze your program.创建互相依赖关系是错误的,这么做将会导致操作之间的死锁,可能会卡住我们的程序。


- (void)dependence {        // 假设有a b c三个操作,要求    /**     *  1. 异步执行     2. 操作C依赖于操作B     3. 操作B依赖于操作A               */        // 1.创建一个队列 非主队列    NSOperationQueue *queue = [[NSOperationQueue alloc] init];        // 2.设置最大并发数    //    queue.maxConcurrentOperationCount = 1;    // 3 添加操作到队列中 自动异步执行  并发    NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"A %@",[NSThread currentThread]);    }];        [operationA addExecutionBlock:^{        NSLog(@"AAAA%@",[NSThread currentThread]);    }];            [operationA setCompletionBlock:^{        NSLog(@"operationA finished %@",[NSThread currentThread]);    }];        NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"B %@",[NSThread currentThread]);    }];    NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"C %@",[NSThread currentThread]);    }];            // 依赖  不能相互依赖    [operationB addDependency:operationA];    [operationC addDependency:operationB];            [queue addOperation:operationB];        [queue addOperation:operationA];        [queue addOperation:operationC];}

- (void)maxCount {    // 1.创建一个队列 非主队列    NSOperationQueue *queue = [[NSOperationQueue alloc] init];        // 2.设置最大并发数    queue.maxConcurrentOperationCount = 1;    // 3 添加操作到队列中 自动异步执行  并发    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"download1 %@",[NSThread currentThread]);    }];        NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"download2 %@",[NSThread currentThread]);    }];    NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"download3 %@",[NSThread currentThread]);    }];        NSBlockOperation *operation4 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"download4 %@",[NSThread currentThread]);    }];                [queue addOperation:operation1];    [queue addOperation:operation2];    [queue addOperation:operation3];    [queue addOperation:operation4];        [queue addOperationWithBlock:^{        NSLog(@"download5%@",[NSThread currentThread]);    }];        [queue addOperationWithBlock:^{        NSLog(@"download6%@",[NSThread currentThread]);    }];        [queue addOperationWithBlock:^{        NSLog(@"download7%@",[NSThread currentThread]);    }];        NSInvocationOperation *operation8 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil]; [queue addOperation:operation8];}- (void)download {    NSLog(@"download-invocation,%@",[NSThread currentThread]);}

    [queue cancelAllOperations]; // 取消队列中的所有任务 不可逆    [queue setSuspended:YES];    // 暂停队列中的所有任务    [queue setSuspended:NO];     // 恢复队列中的所有任务- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {//      [queue setSuspended:YES];    // 暂停队列中的所有任务- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {//    [queue setSuspended:NO];     // 恢复队列中的所有任务    }- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];//    [queue cancelAllOperations]; // 取消队列中的所有任务 不可逆    }


0 0