如果我在iPhone中使用同步连接有什么问题吗?

时间:2011-09-30 15:34:04

标签: iphone objective-c asynchronous nsurlconnection

我知道iPhone中的模式是使用ASync连接调用(使用当前类实现的非正式协议)。

就我而言,我创建了一个实用程序类来执行网络人员,然后将数据返回给ViewController。

我发现不足以在实用程序类中将连接模型实现为Async,因为我将在ViewControlle中编写一段代码,如下所示:(恕我直言不好)

MyUtilityConnection* utilConn = ....
while (true)
{
    if ([utilConn checkUnderlyingAsyncConnectionFinishedLoading]) break;
}
NSData* dataFromUrl = [utilConn dataFromUnderlayingConn];

所以,问题是,在iPhone中使用Sync连接模型会导致问题吗?和解决方案?

(在数据到来之前,绘图会一直悬挂???)

2 个答案:

答案 0 :(得分:1)

AVOID 一定要做同步连接!这显然会冻结你的UI(如果你当然没有良好的带宽,它会变得更糟)。

您可以做的是在需要下载数据时使用块语法编写更易读的代码。创建一个实现NSURLConnection委托方法的类,然后在数据完成时调用该块。


请参阅我在github上的OHURLLoader类,例如那样做(这只是一个解决方案)。

用法示例:

NSURL* url = ...
NSURLRequest* req = [NSURLRequest requestWithURL:url];

OHURLLoader* loader = [OHURLLoader URLLoaderWithRequest:req];
[loader startRequestWithCompletion:^(NSData* receivedData, NSInteger httpStatusCode) {
    NSLog(@"Download of %@ done (statusCode:%d)",url,statusCode);
    outputTextView.text = loader.receivedString;
} errorHandler:^(NSError *error) {
    NSLog(@"Error while downloading %@: %@",url,error);
    outputTextView.text = [error localizedDescription];
}];

答案 1 :(得分:0)

在同步方法(sendSynchronousRequest:returningResponse:error:)期间,UI没有响应(假设在主线程上调用了sync方法)。

但它们在后台线程上很好,在后台线程上完成同步调用的最简单方法是使用GCD