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

发布时间:2020-06-25 07:12:35 作者:iKingLai
阅读:1247
开发者专用服务器限时活动,0元免费领! 查看>>

现在,我将会向你更深入的介绍如何使用之前提到的方法来创建新的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

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

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

开发者交流群:

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

ios 性能优化

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

下一篇:Python 随机模块:uniform

相关阅读

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

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