我想写一个不阻止的方法。该方法不返回任何内容。 这不是通过网络或任何东西 - 它在运行它的设备本地。
基本上,调用方法只是想要一些其他对象来处理某些事情。一旦它告诉它“Go do this”,调用者想要回到做自己的工作而不是等待对象完成任务。
我不想使用NSNotification。
编辑:我希望能够使用iOS 3.1.2及更高版本中提供的框架来实现这一目标
编辑:感谢所有的回复 - 但我不确定选择哪一个。我的要求只是调用方法能够向被调用的方法发送参数,并立即返回而不等待结果。哪个是最好的解决方案?答案 0 :(得分:2)
你使用以下之一:libdispatch,NSOperation,在运行循环中添加一个NSInvocation或'在线程上执行选择器',创建一个线程......
<强>更新强>
这取决于您想要做的事情的时间和复杂程度。如果它相当简单(例如简单的文本解析),那么只需将其添加到主运行循环中。如果需要更多时间(例如下载或打开文件),那么您将希望它脱离主运行循环。
创建一个帖子
您可以使用pthread
接口创建一个或多个线程来执行您的工作。
可以选择pthreads以获得最佳性能并控制列表中的任何选项。关于绩效:要求您了解成本和问题。创建线程并非易事,因此重用它们或将任务分开是很好的。制作和测试并发设计也需要很长时间。
就个人而言,我使用更可移植的抽象(特别是pthreads)来满足我的大部分多线程需求。如果可移植性很重要,那么您可能希望使用这样的抽象层,因为其他选项在Apple系统之外并不常见。
为方便使用objc类型,您还可以使用类似-[NSObject performSelectorInBackground:withObject:]
的内容。
<强> libdispatch 强>
(a.k.a.GCD)
虽然我认为它不适合你,但我会写一个简短的概述:可以比作pthreads上的任务/调度程序/线程池抽象层。该库通常用于并发任务。它使用线程池来执行任务,这可能会阻塞或异步运行。相当快速和简单的抽象,易于使用。
<强>的NSOperation 强>
任务(NSOperation)/ pool + scheduler(NSOperationQueue)基于接口,现在使用libdispatch。这个感觉比libdispatch更专注于任务。它位于libdispatch之前,并具有ObjC接口。但是,功能上存在很多重叠。相当快速和简单的抽象,易于使用。
在运行循环中添加NSInvocation或'在线程上执行选择器'
如果您的任务很简单,您可能希望使用这种低开销方法,只需告诉对象在特定线程上执行选择器或NSInvocation。系统会将它添加到要执行的事情列表中(对于指定的线程的运行循环)。
在阅读了您的更新和评论,而不知道您的具体问题的时间/复杂性后,我建议NSOperation
。 pthread
非常复杂,只要您需要异步执行某些操作,就应该支持在生成线程上进行池化。
答案 1 :(得分:2)
NSObject上有一些有用的方法可以帮到你 - 这个方法可能最多:
[self performSelectorInBackground:@selector(doStuff) withObject:nil];
- (void)doStuff {
// Do whatever you want to do here. It's in the background.
}
但是,假设您不想取消后台任务 - 如果您需要更多控制权,还应该查看NSOperation和NSOperationQueue。
答案 2 :(得分:2)
我会使用GCD。
答案 3 :(得分:1)
使用NSThread
的{{1}}。
答案 4 :(得分:0)
这个小桃子为我工作(为了延迟20秒)......
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 20.0, false);