jrd*_*oko 11 objective-c nsoperationqueue grand-central-dispatch ios serial-processing
Apple的Grand Central Dispatch(GCD)非常棒,但仅适用于iOS 4.0或更高版本.Apple的文档说,"[A]序列化操作队列不提供与Grand Central Dispatch中的串行调度队列完全相同的行为"(因为队列不是FIFO,但顺序由依赖关系和优先级决定).
在GCD发布之前支持操作系统版本的同时,实现与GCD的串行调度队列相同效果的正确方法是什么?或者换句话说,在想要支持低于4.0的版本的iOS应用程序中处理简单后台处理(执行Web服务请求等)的推荐方法是什么?
看来人们要花很多精力来重写 NSRunloop。根据NSRunloop 文档:
\n\n\n\n\n您的应用程序无法创建或显式管理 NSRunLoop 对象。每个 NSThread 对象(包括应用程序 xe2x80x99 的主线程)都有一个根据需要自动创建的 NSRunLoop 对象。
\n
因此,简单的答案肯定是创建一个可用的队列:
\n\n- (void)startRunLoop:(id)someObject\n{\n NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n\n [[NSRunLoop currentRunLoop] run];\n\n [pool release];\n}\n\n...\n\nNSThread *serialDispatchThread = [[NSThread alloc] \n initWithTarget:self \n selector:@selector(startRunLoop:) \n object:nil];\n[serialDispatchThread start];\nRun Code Online (Sandbox Code Playgroud)\n\n要将任务添加到队列中:
\n\n[object\n performSelector:@selector(whatever:) \n onThread:serialDispatchThread\n withObject:someArgument\n waitUntilDone:NO];\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n\n\nCocoa 定义了一个自定义输入源,允许您在任何线程上执行选择器。...执行选择器请求在目标线程上序列化,从而缓解了在一个线程上运行多个方法时可能出现的许多同步问题。
\n
所以你有一个明确的串行队列。当然,我的写得并不出色,因为我已经告诉运行循环永远运行,您可能更喜欢稍后可以终止的循环,但这些都是很容易进行的修改。
\n| 归档时间: |
|
| 查看次数: |
2385 次 |
| 最近记录: |