年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2116|回复: 1

多线程技术NSOperationQueue的2种队列操作示例

[复制链接]
  • TA的每日心情
    奋斗
    2022-12-13 21:26
  • 签到天数: 371 天

    [LV.9]以坛为家II

    发表于 2014-11-8 17:15:26 | 显示全部楼层 |阅读模式
    1、NSOperation的两个子类NSBlockOperationNSInvocationOperation,前者通过Block实现队列执行体,后者通过调用方法实现。

    2、创建好NSOperation任务后,加入到系统队列,分为自定义队列即通过NSOperationQueue创建,或加入到主队列[NSOperationQueue mainQueue]

    3、以上两步即可搞定,NSOperation/NSOperationQueue中程序不需要关心同步/异步、串行/并行问题,由框架自动处理,因此使用起来更方便更安全。

    4、操作任务一添加到队列中即会执行,这一点与GCD不同。

    5、如果需要指定任务的先后执行任务,可使用NSOperation的 addDependency: 方法,如 [op2 addDependency:op1] 表示op2依赖于op1,因此会在op1后被执行。(注意不要出现循环依赖)

    6、如果需要限制线程数,可通过NSOperationQueue的 setMaxConcurrentOperationCount: 方法实现,如图片下载任务在WiFi环境中线程数为6,3G环境中为3

    关键代码示例:
    1. // 创建一个自定义队列
    2. @property (nonatomic, strong) NSOperationQueue  *myQueue;
    3.     // 初始化自定义队列
    4.     self.myQueue = [[NSOperationQueue alloc] init];
    5. #pragma mrak 1、Block队列操作
    6. - (void)blockOperation
    7. {
    8.     // 循环10次添加10个任务到自定义队列
    9.     for (int i = 0; i < 10; i++) {
    10.         
    11.         // 创建一个操作任务,不需要关心串行并行等问题
    12.         NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
    13.             
    14.             // 每执行一次任务,输出该任务的添加序号及线程对象
    15.             NSLog(@"第 %d 次 - %@", i, [NSThread currentThread]);
    16.         }];
    17.         
    18.         // 将任务添加到自定义队列中,默认将异步并行执行
    19.         [self.myQueue addOperation:blockOp];
    20.         
    21.         // 将任务添加到主队列中,即在主线程中执行
    22.         // [[NSOperationQueue mainQueue] addOperation:blockOp];
    23.     }
    24. }
    25. #pragma mark 2、invocation队列操作
    26. - (void)invocationOperation
    27. {
    28.     for (int i = 0; i < 10; i++) {
    29.         
    30.         // 与NSBlockOperation类似,唯一不同的是这里通过调用方法实现队列执行体
    31.         NSInvocationOperation *invocationOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationAction:) object:@(i)];
    32.         
    33.         [self.myQueue addOperation:invocationOp];
    34.         
    35.         // [[NSOperationQueue mainQueue] addOperation:invocationOp];
    36.         
    37.     }
    38. }
    39. #pragma mark 调用方法
    40. - (void)operationAction:(id)obj
    41. {
    42.     NSLog(@"第 %d 次 - %@", [obj intValue], [NSThread currentThread]);
    43. }
    复制代码
    Demo下载:
    游客,如果您要查看本帖隐藏内容请回复



  • TA的每日心情
    犯困
    2015-1-11 14:36
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2015-6-26 11:53:18 | 显示全部楼层
    看一看怎么回事
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-5-3 07:55 , Processed in 0.053181 second(s), 25 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表