Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 异步NSUrlConnection不在主runloop上_Objective C_Cocoa_Asynchronous_Nsurlconnection - Fatal编程技术网

Objective c 异步NSUrlConnection不在主runloop上

Objective c 异步NSUrlConnection不在主runloop上,objective-c,cocoa,asynchronous,nsurlconnection,Objective C,Cocoa,Asynchronous,Nsurlconnection,我正在创建一组与web服务接口的类。其核心是使用异步NSUrlConnection从服务中检索数据。在我看来,异步是很重要的,因为这些web服务接口的客户端必须能够取消正在进行的请求(即取消NSUrlConnection) web服务调用返回JSON数据,可能会返回大量数据,这些数据会被解析,我正在创建的类将从中创建适当的数据结构。根据调用哪个web服务方法,请求可能会很昂贵—在主线程上运行太昂贵,因此我想添加异步运行服务请求的选项,或者不提供该选项,并强制异步调用 异步调用都很好,但我在非主运

我正在创建一组与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服务接口,其中我代码的客户端不需要担心它们自己的委托(我的类持有引用)是否会在不同的线程上被调用。我希望在调用我的代码的同一个运行循环中调用它们——基本上,就是NSUrlConnection的运行方式

提前谢谢!
尼克

我想你可以说是“走错了路”。一般来说,你不需要担心运行循环,除非你正在做一些非常奇怪的事情。听起来您需要阅读一些关于多线程的内容,特别是Grand Central Dispatch。

如果我使用并发NSO操作或使用GCD执行此操作,我会遇到同样的问题。我之所以担心运行循环,是因为对NSUrlConnection进行异步调用的任何异步调用都会在之后不久终止,因此NSUrlConnection无法在原始运行循环上调用我的委托。