iOS使用多线程提高数据并发访问 之四

发布时间:2020-06-25 07:12:35 作者:iKingLai
来源:网络 阅读:1222

现在,我将会向你更深入的介绍如何使用之前提到的方法来创建新的operations。


NSInvocationOperation


当一个新的NSInvocationOperation对象创建时,它是用来运行指定的一个方法。你可能会想要使用这个对象,如果


创建一个NSInvocationOperation对象的代码如下:


NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self

selector:@selector(myTaskMethod:) object:data];


这个和使用NSThread创建和detach一个新的线程类似。你传递一个目标对象,你想要调用的selector,还有在执行时selector想要使用的参数。


NSBlockOperation


NSBlockOperation是NSOperation的另一个子类。当你创建一个block operation时,你必须在这个operation 对象内至少添加一个block。之后你可以在这个operation对象内添加更多的block来执行。当operation queue执行这个block operation时,它会在这个block operation结束之前执行这个block operation内的所有blocks。因此,你可以使用这个operation对象来跟踪一组blocks,然后你可以合并会处理相关结果。


创建一个block operation对象,你可以使用下面的代码:


NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{

       NSLog(@"Beginning operation.\n");
       // Do some work.

}];


然后你可以在这个operation中添加另一个block:


[theOp addExecutionBlock:[NSBlockOperation blockOperationWithBlock: ^{

       NSLog(@"Beginning operation.\n");
       // Do some work.

}];


NSOperation


NSOperation是用来被继承的一个类。要继承NSOperation,你可以使用两种推荐的方法来创建。

  • 自定义初始化方法:可以在这个类中接收数据和进行一些必要的逻辑处理。例如,你可以在init方法中接收一个url来下载图片,类似这样:

       

   - (id)initWithData:(id)data {

           if ((self = [super init]))

               myData = data;              

           return self;

       }


  • main方法:这是一个必须的方法,当任务启动时被调用。


为了得到一个并发的NSOperation子类,你必须重写更多的方法来帮助NSOperationQueue对象来处理调用者的多线程请求。

  • start或main:你需要重写这个方法或main方法,当线程启动你的operations时,能够执行你的逻辑。默认,这个方法没有做任何事情,除了调用main方法。因此,你可以重写这个方法或main方法。

  • isExecuting或isFinished:你的operation需要报告它当前的状态给外面的客户端。有两个最重要的状态就是:你的operation已经开始执行,你的operation已经执行完毕。因此你需要在这里通过使用属性或实例变量来跟踪和报告这些状态。

  • isConcurrent:你必须重写这个方法,然后返回YES。


其他方法不是强制性的,但是你可能经常会需要他们。

  • 其他逻辑处理方法:除非你想把所有的代码都放在main方法中,你同样需要其他的方法来包含你的逻辑处理代码。


Listing 6-4 显示了一个自定义和并发的NSOperation类的完整代码。


iOS使用多线程提高数据并发访问 之四

iOS使用多线程提高数据并发访问 之四

Listing 6-4 展示了如何编写一个自定义的NSOperation,使用多线程来从网络下载一张图片。


注意:如果你之前做过java编程,你会发现NSOperation和Thread类或Runnable接口很像。在Thread类中,你可以继承Thread类,然后重写run方法。对于Runnable接口也一样,你需要实现Runnable接口,然后重写run方法。你可以看到,NSoperation的main方法和Thread类,Runnable接口的run方法是一样的。



配置一个线程


你可以使用一些选项来配置你的线程,这样你就可以使用系统资源而不需要重载他们,尤其是在受限的运行时环境中,比如iPhone。


NSThread* myThread = [[NSThread alloc]initWithTarget:self

selector:@selector(myThreadMainMethod:)object:nil];

[myThread setStackSize:40960]; // 40KB here, the size is in bytes and multiple of 4KB

[myThread start]; // Actually create the thread




推荐阅读:
  1. iOS使用多线程提高数据并发访问 之十
  2. iOS使用多线程提高数据并发访问 之八

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

ios 性能优化

上一篇:三层交换的基本配置

下一篇:Python 随机模块:uniform

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》