在后台加载网址图片更快

时间:2013-06-06 03:41:24

标签: image uiimage

我正在做一个教程,他们要求我在背景中添加一个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++;

}

1 个答案:

答案 0 :(得分:0)

是。将异步样式与NSURLConnection一起使用。也就是说,实现委托方法。

由于您似乎还需要发送大量请求,因此最好将连接和所有相关数据(如响应数据)封装到一个负责执行 one 的类中请求。

如果您将此类设为NSOperation的子类,则可以使用NSOperationQueue来控制同时活动的连接数。

但是,实施正确可靠的连接类可能是一项具有挑战性的任务。因此,您可能会寻找第三方库。另请查看Apple提供的网络示例,尤其是QHTTPOperation

为了使这种快速可靠,还有很多话要说。但我建议从继承自NSObject的类(比如HTTPRequestOperation)开始实现,它实现了两个NSURLConnection委托协议。有一个启动,取消,isFinished,isCancelled和isExecuting属性/方法和一个完成块(可能是一个属性),它将在连接完成时被调用,已被取消或失败。它看起来像一个NSOperation子类 - 但这不是必需的。稍后您可以在需要时轻松地将其作为NSOperation的子类。

完成块传递类型为id的参数 result - 它是响应的正文数据,或者是连接失败时的NSError对象。 cancel方法必须是线程安全的 - 因为这可以从任何线程调用。

首先,应在主线程上安排连接委托方法。稍后您可以使用专用线程 - 或NSOperationQueue

我有一个简单的示例实现,它有170行代码,标题有20行。只是为了给你一个主意。 ;)