RestKit完成块是否在主UI线程上运行?

时间:2013-12-28 01:03:11

标签: ios multithreading restkit

我的代码告诉我这是通过[NSThread currentThread] isMainThread]以及我可以展示UIAlertView的事实。这看起来很意外,因为我的理解是请求是异步调度的。

我会抛出一些相关的代码,但没什么特别的。我POST通过RKObjectManagersuccessfailure完成块在主UI线程上执行{{1}}对象(即使我在请求后肯定在后台执行操作)完成)。

我很困惑。

发生了什么事?

2 个答案:

答案 0 :(得分:7)

幕后的

RKObjectManager创建并发布RKObjectRequestOperation(实质上是您的POST请求的表示)到NSOperationQueue,以便在后台线程中异步执行所有网络和映射。

请求完成并处理响应时 - 默认行为是在主线程上运行successfailure回调。这是一个很好的快速设置,可以帮助您快速,轻松地构建应用程序(而不用担心在正确的线程上更新UI)。

您可以轻松更改该行为,RKObjectRequestOperation有2个属性,successCallbackQueuefailureCallbackQueue,您可以将它们设置为另一个后台线程,然后当您需要更改某些内容时在UI方面,只需将该更改包装到一个块中并发布到主队列:

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
    }];

答案 1 :(得分:4)

您希望请求的原因是异步调度的,因为您不希望请求阻止UI线程(主线程)。因为当它被阻止时,你的应用程序不会对用户的行为作出反应,这是一种糟糕的用户体验。

然后在请求完成后,您希望让用户知道它,因此调度的线程必须返回主线程。在你的情况下,这是完成块。那么你就可以在主线程上做一些show alert。

我希望这是你想要的答案。