0

我正在做一个教程,他们要求我在后台将 urlimage 加载到 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++;

}
4

1 回答 1

0

是的。将异步样式与NSURLConnection. 也就是说,实现委托方法。

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

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

然而,实现一个正确可靠的连接类可能是一项具有挑战性的工作。因此,您可能会寻找第三方库。还可以查看 Apple 提供的网络示例,尤其是QHTTPOperation.

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

完成块传递一个类型的参数结果id——它可以是响应的主体数据,也可以是NSError连接失败时的对象。该cancel方法必须是线程安全的——因为它可以从任何线程调用。

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

我有一个简单的示例实现,它有 170 行代码和 20 行的标题。只是给你一个想法。;)

于 2013-06-06T21:16:02.907 回答