iOS 3.x中等效的GCD串行调度队列

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服务请求等)的推荐方法是什么?

Tom*_*mmy 3

看来人们要花很多精力来重写 NSRunloop。根据NSRunloop 文档:

\n\n
\n

您的应用程序无法创建或显式管理 NSRunLoop 对象。每个 NSThread 对象(包括应用程序 xe2x80x99 的主线​​程)都有一个根据需要自动创建的 NSRunLoop 对象。

\n
\n\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];\n
Run Code Online (Sandbox Code Playgroud)\n\n

要将任务添加到队列中:

\n\n
[object\n    performSelector:@selector(whatever:) \n    onThread:serialDispatchThread\n    withObject:someArgument\n    waitUntilDone:NO];\n
Run Code Online (Sandbox Code Playgroud)\n\n

根据线程编程指南有关运行循环的部分:

\n\n
\n

Cocoa 定义了一个自定义输入源,允许您在任何线程上执行选择器。...执行选择器请求在目标线程上序列化,从而缓解了在一个线程上运行多个方法时可能出现的许多同步问题。

\n
\n\n

所以你有一个明确的串行队列。当然,我的写得并不出色,因为我已经告诉运行循环永远运行,您可能更喜欢稍后可以终止的循环,但这些都是很容易进行的修改。

\n