【问题标题】:Adding NSOperation to NSOperationQueue that starts asynchronous ASIHTTPRequest将 NSOperation 添加到启动异步 ASIHTTPRequest 的 NSOperationQueue
【发布时间】:2010-08-12 14:07:27
【问题描述】:

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

我有一个包含 NSOperationQueue 的视图控制器。我创建了一个导入器类的实例,它是 NSOperation 的子类。在我的导入器的 main() 方法中,我设置了一个 ASIHTTPDataRequest。我创建了请求,然后是时候启动请求了。

问题: 通过对请求调用“startAsynchronous”来启动请求时,我遇到了问题。委托回调永远不会被调用。就像请求开始,下载数据,但从不调用委托回调方法。

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

为什么同步调用有效,而异步调用无效?我正在模仿 Apples “TopSongs” 样本的导入器类。

【问题讨论】:

    标签: iphone asynchronous asihttprequest nsoperation nsoperationqueue


    【解决方案1】:

    如果您从主线程运行,ASIHTTPRequest 本身不应阻塞 UI。

    • ASIHTTPRequest 并非设计为从后台线程运行。 [ASIHTTPRequest requestFinished] 在主线程上调用“完成”回调;后台线程永远不会收到它,因此后台线程的运行循环永远不会运行。
    • ASIHTTPRequest 是一个 NSOperation无论如何。这是一个实现细节。
    • 默认情况下,ASIHTTPRequest 在后台线程中运行其网络代码,因此将其放在另一个线程中不太可能带来太多好处。

    如果解析需要很长时间的数据,请将其放入操作中。

    【讨论】:

    • 我将 REST 请求调用移至我自己的 NSOperation 的主要原因是,在请求完成后,它将解析并保存到同一个后台线程上的核心数据中,保持 UI 响应并允许核心要在主线程上通知的数据已更新,因此在主线程上更新我的表。
    • 所以将解析/保存到另一个线程,并在主线程中协调东西。
    • 我想我现在被这个刺痛了 (stackoverflow.com/questions/5274236/…)。我没有理由让完成处理程序在主线程上运行,而不是在启动它们的同一线程上运行。通常您需要在完成处理程序中处理下载的数据,但这种方法使这成为不可能(除非您从完成处理程序产生一个新线程)。
    • @Martin:ASIHTTPRequest 被设计为从主线程使用,“异步”执行请求,然后在主线程返回响应;这是防止并发问题的最简单方法。 (IIRC,ASIHTTPRequest 默认情况下也在主线程上执行大部分/所有处理,这可能并不比上下文切换贵多少。)执行多个依赖操作的规范方法是使用依赖 NSOperations。 ASIHTTPRequest 在内部使用 NSOperation,因此您甚至可以毫不费力地做到这一点。
    【解决方案2】:

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

    【讨论】:

    • 在我之外使用 ASIHTTPRequest 而不是 NSURLConnection,“TopSongs”示例与我做的事情相同。它使用 [[NSURLConnceciton alloc] initWithRequest:request delegate:self];这也是异步的,并且工作正常。所以在我看来,这与 ASIHTTPReqeust 的 startAsynchronous 调用有关。
    • 你使用过这样的代码吗:do { [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate } while (!done);
    • 是的。我怀疑 ASIHTTPRequest 中的某些东西会导致此问题。调试异步测试我发现它永远不会到达上面列出的“do...while”循环之后的行。就像代码通过 do/while 语句并且从不执​​行任何低于它的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    相关资源
    最近更新 更多