我必须20-25下载每张50 Kb-2 Mb的图像并在桌面视图中显示它们。 我对此使用了ASIHTTPRequest asyn请求。我观察到一段时间后应用程序卡住了。这不应该发生,因为我正在使用异步调用。我认为ASIHTTPRequest出了问题,我发现在主线程中调用了didFinished选择器。我唯一能做的就是
-(void)didFinishedDownloadingImage:(ASIHTTPRequest*)request { NSData *responseData = [request responseData]; UIImage *image = [UIImage imageWithData:responseData]; [[data objectAtIndex:request.tag] setImage:image]; [self.tableView reloadData]; }
我不认为这会导致任何问题。同样在cellforrowatindexpath我只是做
- (UItableViewCell *)tableviewView:(UItableView *)tableview cellForItemAtIndexPath:(NSIndexPath *)indexPath { UserProfile * user = [data objecAtIndex:indexpath.row]; UITableViewCell *cell = [tableView dequeueReusableCellWithReuseIdentifier:@"ProfileCell" forIndexPath:indexPath]; if(cell == nil){ cell = [[UITableViewCell alloc] initWithStyle:UITableViewDefaultStyle]; } NSString *fullname = [NSString stringWithFormat:@"%@\n%@", user.firstname, user.lastname]; if(user.image != nil) [cell.imageView setImage:user.image]; else{ [cell.imageView setImage:[UIImage imageNamed:@"placeholder.jpg"]]; } [cell.label setText:fullname]; return cell; }
但应用程序很慢并且冻结1-2秒,这是相当长的时间。 我见过的应用程序非常顺利。我尝试使用固定大小为5Kb的图像,使用上面的代码可以提高性能。在这种情况下,我不知道为什么这对大图像有所作为,因为所有下载都是通过ASIHTTP在其他线程中进行的。
答案 0 :(得分:2)
请将您的框架替换为AFNetworking。
你可以简单地使用..
IImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]];
或...直接在TableViewCell
中NSURL *url = [[NSURL alloc] initWithString:[movie objectForKey:@"artworkUrl100"]];
[cell.imageView setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeholder"]];
“在第二行中,我们通过传递NSURL告诉图像视图缩略图所在的位置,我们传入一个占位符图像,只要我们的请求没有返回响应就会显示”
多数民众赞成!
这里有一个关于http://mobile.tutsplus.com/tutorials/iphone/ios-sdk_afnetworking/
的教程答案 1 :(得分:1)
很容易对滞后/慢速应用的根本原因做出假设。而不是猜测,为什么不测试你的怀疑?使用Time Profiler仪器分析您的应用程序。它会告诉您应用程序花费最多时间的方法和功能。
以下是一些想法,直到您有机会进行介绍:
您可以考虑下载完整分辨率图像并在后台创建缩略图,然后在NSCache
对象中缓存它们。您还可以在后台线程中运行[UIImage imageWithData:responseData];
。它是线程安全的,直到它与视图层次结构交互。
选择性地重新加载单个单元格应该比重新加载整个tableview更快,尤其是具有大量图像的那个。此外,如果您在后台队列上进行所有网络和处理,则没有理由滚动tableview应该很慢。你能告诉我们你-cellForRowAtIndexPath:
方法的整个实现吗?您已经提到您认为setImage:
是您的慢点,因为渲染速度很慢。如果重新加载单个单元格,则只需要渲染一个单元格。如果您重新加载整个tableview,则必须重新呈现每个单元格。