请在投票前阅读或建议我使用STACKOVERFLOW的其他链接。
有许多结构可以从服务器下载数据。喜欢
另一种方式是
另一种方式是
创建一个文件来设置连接,并创建另一个文件来管理解析器
ViewController =====================>> URLConnection
Delegate of URLConnectionfile =====================>> ViewController
然后,在此委托中,从服务器下载的NSData将进一步发送到Parser类
ViewController =======================>> ParserClass
Delegate of Parser gives Array to ================= ViewController
然后显示该数组
另一种方法是使用线程
在
中调用此类方法[self performSelectorInBackground:@selector(doSomething)withObject:nil];
然后在 doSomething 中,调用您的连接文件
任何人都可以定义以最有条理和最恰当的方式下载和保存的最佳方式,这样就可以轻松管理并且不会出现视图挂起。
由于
答案 0 :(得分:1)
不要在主线程上运行下载和解析代码。这是唯一的方法,以避免UI冻结。
推荐方式,
NSOperation
和NSOperationQueue
AFNetworking
,MKNetworkKit
等。此外,如果您在表视图中有图像,请使用称为延迟加载的技术。
我建议不要使用[self performSelectorInBackground:@selector(doSomething) withObject:nil];
。如果您不知道如何使用它会变得混乱,而不是使用GCD。
修改强>
通常,我关注的是,
NSOperation
和NSOperationQueue
处理Web服务调用(您可以使用GCD或其他框架)。任何调用WS的视图控制器都将与该类通信。NSOperationQueue
创建的后台线程上进行。因此不会冻结UI。在viewDidLoad
中启动对WS的调用,并显示进度指示器,直到进程完成。但有些时候要求是在下载WS响应之前不会创建视图控制器。因此,发起请求的选择取决于您的要求。
希望有所帮助!
答案 1 :(得分:1)
从iOS4 + Apple开始推出GCD。见Concurrency Programming Guide: Dispatch Queues
这可能是做异步内容的最佳和最推荐的方法(尤其是网络连接)。
示例
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
NSHTTPURLResponse *response = nil;
NSError *error = nil;
NSData *responseData = nil;
NSDictionary *responseDictionary = nil;
responseData = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60] returningResponse:&response error:&error];
//Update the UI after this
dispatch_async(dispatch_get_main_queue(), ^{
[self updateUIAfterParsing];
});
});
答案 2 :(得分:0)
我的建议是,您可以使用GrandCentralDispatch(GCD)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
for(NSString *urlString in self.urlArray)
{
NSURL *url=[NSURL URLWithString:urlString];
NSData *data=[NSData dataWithContentsOfURL:url];
UIImage *image=[UIImage imageWithData:data];
//delegate to parse the content/data
//delegate to save data/images into documents directory/DB
}
dispatch_async(dispatch_get_main_queue(), ^{
//UIUpdation, fetch the image/data from DB and update into your UI
});
});