我知道iPhone中的模式是使用ASync连接调用(使用当前类实现的非正式协议)。
就我而言,我创建了一个实用程序类来执行网络人员,然后将数据返回给ViewController。
我发现不足以在实用程序类中将连接模型实现为Async,因为我将在ViewControlle中编写一段代码,如下所示:(恕我直言不好)
MyUtilityConnection* utilConn = ....
while (true)
{
if ([utilConn checkUnderlyingAsyncConnectionFinishedLoading]) break;
}
NSData* dataFromUrl = [utilConn dataFromUnderlayingConn];
所以,问题是,在iPhone中使用Sync连接模型会导致问题吗?和解决方案?
(在数据到来之前,绘图会一直悬挂???)
答案 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
。