2

我目前在我的一个 iPhone 应用程序中使用 AFNetworking。它确实是一个方便的异步调用库。但是,我在我的应用程序中遇到了需要从服务器获取数据才能继续前进的情况。所以我想出了这种等待回复的方式。

    MyAFNetworkClient *httpClient = [MyAFNetworkClient sharedClient];

    NSURLRequest *request = [httpClient requestWithMethod:@"GET" path:path parameters:nil];

__block int status = 0;

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

    [[NSNotificationCenter defaultCenter] postNotificationName:@"notificationName" object:JSON];

} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON){
    @throw error.userInfo;
    status = 2;
    NSLog(@"Error... Status Code 2");

}];
[httpClient enqueueHTTPRequestOperation:operation];
[httpClient.operationQueue waitUntilAllOperationsAreFinished];

while (status == 0)
{
    // run runloop so that async dispatch can be handled on main thread AFTER the operation has
    // been marked as finished (even though the call backs haven't finished yet).
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
                             beforeDate:[NSDate date]];
}

使用这段代码,我可以等待服务器返回的响应并继续进行。它似乎确实解决了我的问题,但是,不确定这是否是拨打电话的好方法。如果是的话,是否有一个好的设计原则可以让我保持代码通用并在我的应用程序中使用它。

谢谢

4

2 回答 2

12

永远不要阻塞主 (UI) 线程。也就是说,永远不要同步组网。

在您的请求加载的整个过程中,您的应用程序似乎已冻结——在请求完成之前对触摸和系统事件完全没有响应。

至少,显示一个在请求完成之前不会关闭的加载模式。更好的是,如果可能的话,让用户可以在请求加载时正常交互应用程序。

您在这里所拥有的在技术上可能有效,但对于实际应用程序来说是不可接受的。

于 2013-05-23T16:08:33.130 回答
0

对于所有遇到相同情况的人来说,您正在进行异步调用并希望等待数据返回主线程以执行其他操作,这可能会有所帮助

设想:

用户验证:用户输入用户名、密码并尝试登录。

解决方案:向他们展示加载模式,告诉他们幕后正在发生什么事情,一旦你得到响应,你就可以像下面那样进入主线程。

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
         // perform next steps....
        });

}

感谢@matt 提供了在这种情况下需要做什么的提示。

于 2013-05-25T23:47:03.877 回答