我正在做一个教程,他们要求我在背景中添加一个ulimage到uitableview。下面是我正在使用的代码,加载速度非常慢。是否有一个代码,使其加载更快?
NSOperationQueue * backgroundQue = [[NSOperationQueue alloc] init];
int websiteNumber=0;
for (NSString* website in websites){
[backgroundQue addOperationWithBlock:^{
NSURL* iconURL=[NSURL URLWithString:
[NSString stringWithFormat:@"http://%@/favicon.ico", website]];
NSURLRequest*request=[NSURLRequest requestWithURL:iconURL];
NSData* loadData = [NSURLConnection
sendSynchronousRequest:request returningResponse:nil error:nil];
if(loadData !=nil){
UIImage* loadImage= [UIImage imageWithData:loadData];
if(loadImage ==nil){
return ;
}
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
[websiteIcons replaceObjectAtIndex:websiteNumber withObject:loadImage];
[self.tableView reloadData];
}];
}
}];
websiteNumber++;
}
答案 0 :(得分:0)
是。将异步样式与NSURLConnection
一起使用。也就是说,实现委托方法。
由于您似乎还需要发送大量请求,因此最好将连接和所有相关数据(如响应数据)封装到一个负责执行 one 的类中请求。
如果您将此类设为NSOperation
的子类,则可以使用NSOperationQueue
来控制同时活动的连接数。
但是,实施正确可靠的连接类可能是一项具有挑战性的任务。因此,您可能会寻找第三方库。另请查看Apple提供的网络示例,尤其是QHTTPOperation
。
为了使这种快速可靠,还有很多话要说。但我建议从继承自NSObject
的类(比如HTTPRequestOperation)开始实现,它实现了两个NSURLConnection委托协议。有一个启动,取消,isFinished,isCancelled和isExecuting属性/方法和一个完成块(可能是一个属性),它将在连接完成时被调用,已被取消或失败。它看起来像一个NSOperation子类 - 但这不是必需的。稍后您可以在需要时轻松地将其作为NSOperation的子类。
完成块传递类型为id
的参数 result - 它是响应的正文数据,或者是连接失败时的NSError
对象。
cancel
方法必须是线程安全的 - 因为这可以从任何线程调用。
首先,应在主线程上安排连接委托方法。稍后您可以使用专用线程 - 或NSOperationQueue
。
我有一个简单的示例实现,它有170行代码,标题有20行。只是为了给你一个主意。 ;)