当前位置:  开发笔记 > IOS > 正文

如何在单独的线程中运行一段代码?

如何解决《如何在单独的线程中运行一段代码?》经验,为你挑选了4个好方法。

我有几个这样的方法调用:

[self myFoo];
[self heavyStuff]; // this one in other thread
[self myBar];

我必须看哪些类/方法?当我搜索"线程"时,会出现很多类,方法和函数.哪一个最适合这里?



1> Marc W..:

你会的

[self performSelectorInBackground:@selector(heavyStuff) withObject:nil];

请参阅Apple网站上的NSObject 参考.



2> Barry Wark..:

对于"火与忘",试试吧[self performSelectorInBackground:@selector(heavyStuff) withObject:nil].如果你有这样的多个操作,你可能想要检查NSOperation它的子类NSInvocationOperation.NSOperationQueue托管线程池,并发执行操作的数量,并包括通知或阻止方法,以告诉您何时完成所有操作:

[self myFoo];

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self                                                                                                                                   selector:@selector(heavyStuff) object:nil];

[operationQueue addOperation:operation];
[operation release];

[self myBar];

...

[operationQueue waitUntilAllOperationsAreFinished]; //if you need to block until operations are finished

在较低级别,您可以使用-[NSThread detachNewThreadSelector:@selector(heavyStuff) toTarget:self withObject:nil].



3> Rob Napier..:

你在这里有很多很棒的指针,但不要忘记花点时间阅读线程编程指南.它不仅提供了很好的技术指导,而且还提供了良好的并发处理设计,以及如何更好地利用线程而不是线程来运行循环.



4> Frank Schmit..:

如果您专门针对Snow Leopard,可以使用Grand Central Dispatch:

 [self myFoo];
 dispatch_async(dispatch_get_global_queue(0, 0), ^{
     [self heavyStuff];
     dispatch_async(dispatch_get_main_queue(), ^{
       [self myBar];
     });
 });

但它不会在早期的系统(或iPhone)上运行,并且可能有点过分.

编辑:它从iOS 4.x开始在iPhone上运行.

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有