Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.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
Iphone 将NSOperation添加到启动异步ASIHTTPRequest的NSOperationQueue_Iphone_Asynchronous_Asihttprequest_Nsoperation_Nsoperationqueue - Fatal编程技术网

Iphone 将NSOperation添加到启动异步ASIHTTPRequest的NSOperationQueue

Iphone 将NSOperation添加到启动异步ASIHTTPRequest的NSOperationQueue,iphone,asynchronous,asihttprequest,nsoperation,nsoperationqueue,Iphone,Asynchronous,Asihttprequest,Nsoperation,Nsoperationqueue,因此,我尝试在后台线程上执行所有REST调用来下载数据,以便UI保持响应 我有一个包含NSOperationQueue的viewcontroller。我创建了importer类的一个实例,它是NSOperation的一个子类。在导入程序的main()方法中,我正在设置一个ASIHTTPDataRequest。我创建了请求,然后是开始请求的时候了 问题: 通过调用请求上的“startAsynchronous”启动请求时遇到问题。代理回调从未被调用。它类似于请求启动、下载数据,但从不调用委托回调方法

因此,我尝试在后台线程上执行所有REST调用来下载数据,以便UI保持响应

我有一个包含NSOperationQueue的viewcontroller。我创建了importer类的一个实例,它是NSOperation的一个子类。在导入程序的main()方法中,我正在设置一个ASIHTTPDataRequest。我创建了请求,然后是开始请求的时候了

问题: 通过调用请求上的“startAsynchronous”启动请求时遇到问题。代理回调从未被调用。它类似于请求启动、下载数据,但从不调用委托回调方法

我的解决方案: 当我同步启动请求时,一切似乎都正常工作(即回调等)。这是正确的解决方案吗


为什么同步调用有效,而异步调用无效?我在苹果“TopSongs”示例之后对导入器类进行建模。

当方法
main()
结束执行时,
NSOperation
设置为finished and released,因此您会收到委托回调,因为委托已被释放。

如果从主线程运行,ASIHTTPRequest本身不应该阻止UI

  • ASIHTTPRequest不是为从后台线程运行而设计的。调用主线程上的“finished”回调;后台线程永远不会收到它,因此后台线程的运行循环永远不会运行
  • ASIHTTPRequest无论如何都是一个NSO操作。这是一个实现细节
  • 默认情况下,ASIHTTPRequest在后台线程中运行其网络代码,因此将其粘贴到另一个线程中不太可能有什么好处

如果解析数据需要很长时间,请将其保留在操作中。

在我之外,使用AsiTRequest而不是NSURLConnection,“TopSongs”示例执行与我相同的操作。它使用[[nsurlconnceiton alloc]initWithRequest:request委托:self];这也是异步的,而且工作正常。因此,在我看来,这似乎与AsiHttpRequest的startAsynchronous调用有关。您是否使用以下代码:{[[nsrunlop currentRunLoop]运行模式:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];}而(!done);对我怀疑ASIHTTPRequest中的某些内容导致了此问题。调试异步测试时,我发现它从未到达上面列出的“do…while”循环之后的行。这就像代码从do/while语句中掉下来,并且从未执行过下面的任何代码。将讨论转移到我将REST请求调用移动到自己的NSOperation的主要原因,是因为请求完成后,它将解析并保存到同一后台线程上的核心数据中,保持UI的响应性,并允许在主线程上通知核心数据其已更新,从而在主线程上更新我的表。因此,将解析/保存操作坚持到另一个线程中,并协调主线程中的内容。我想我现在被这一点刺痛了()。我不明白为什么在主线程上运行完成处理程序,而不是在启动它们的同一线程上运行。通常,您需要在完成处理程序中处理下载的数据,但这种方法不可能做到这一点(除非您从完成处理程序生成新线程)。@Martin:ASIHTTPRequest设计为从主线程使用,以“异步”方式执行请求,然后在主线程上返回响应;这是防止并发问题的最简单方法。(IIRC,ASIHTTPRequest默认情况下也在主线程上执行其大部分/全部处理,这可能不会比上下文切换昂贵多少。)执行多个依赖操作的标准方法是使用依赖操作。ASIHTTPRequest在内部使用NSOperation,因此您甚至可以轻松地完成此操作。