异步NSUrlConnection不在主runloop上

时间:2012-02-02 23:46:23

标签: objective-c cocoa asynchronous nsurlconnection

我正在创建一组与Web服务接口的类。在此核心,使用异步NSUrlConnection从服务中检索数据。在我看来,重要的是它是异步的,因为这些Web服务接口的客户端必须能够取消正在进行的请求(即取消NSUrlConnection)。

Web服务调用返回JSON数据,可能有很多数据,并且这被解析,我正在创建的类将从中创建适当的数据结构。根据调用哪种Web服务方法,请求最终可能会很昂贵 - 在主线程上运行起来太昂贵,所以我想添加异步运行服务请求的选项,或者不提供选项,并强制执行异步调用。

异步调用一切都很好,但我在运行环路上异步启动NSUrlConnection时出现问题,而不是主要的。我正在描述的问题似乎有相当好的记录:我被引导相信NSUrlConnection的委托没有被调用,因为启动连接的runloop已经终止,因此无法在其runloop上调度回委托的调用

解决此问题的最佳方法是什么?

我尝试过使用:

   while (!self.isRequestComplete && !self.isRequestCancelled)
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }

似乎从我所做的基本试验中可以正常工作,除非正在执行的runloop实际上是主要的runloop,我已经有一些崩溃...

是否可以选择向客户端提供异步调用,如果使用该选项,则使用上述方法?有没有更好的方法来实现我想要做的事情?

我的目标是实现一个允许与我的特定Web服务连接的类包,其中我的代码的客户端不需要担心他们自己的代理(我的类持有引用)是否将是在不同的线程上调用。我希望在他们调用我的代码的完全相同的runloop上调用它们 - 基本上,确切地说NSUrlConnection如何操作!

提前致谢! 尼克

1 个答案:

答案 0 :(得分:0)

我想你可能已经“走错了小溪”可以这么说。一般来说,除非你做的事情比较奇怪,否则你不必担心运行循环。听起来你需要对多线程进行阅读,尤其是Grand Central Dispatch。