UITableView图像在单元格卡住

时间:2015-01-06 13:07:10

标签: ios objective-c uitableview uiimageview

我正在开发一个使用UITableView的应用程序,它包含大小为320 X 200的UIImageView的单元格。 这些图像来自网址和存储到我的应用文件夹。然后我向用户显示此图像。

为此我正在使用“UIImageView + AFNetworking.h”类的以下方法。

- (void)setImageWithURL:(NSString *)url
   placeholderImageName:(NSString *)placeholderImage
           saveFilePath:(NSString *) filePath
              IndexPath:(NSIndexPath *)indexPath
                success:(void (^)(NSIndexPath *indexPath, UIImage *image))success
                failure:(void (^)(NSIndexPath *indexPath, NSError *error))failure {
    NSLog(@"DOWNLOAD IMG URL :: %@", url);


    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
    [request setHTTPShouldHandleCookies:NO];
    [request setHTTPShouldUsePipelining:YES];
    [request addValue:@"image/*" forHTTPHeaderField:@"Accept"];

    [self setImageWithURLRequest:request
                placeholderImage:placeholderImage == nil? nil : [UIImage imageNamed:placeholderImage]
                         success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
                             [Storage SaveImage:image WithFileName:filePath];
                             if (success)
                                 success(indexPath, image);
                         }
                         failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
                             if (failure) 
                                 failure(indexPath, error);
                         }
     ];        
}

当我的所有图像下载到我的本地文件夹后,我的桌面视图在显示图像时卡住了。

3 个答案:

答案 0 :(得分:1)

下载可能与主线程同步并在下载完成之前阻止它。

我在我的项目中使用SDWebImage。它的工作非常好。

修改

好的,AFNetworking正在异步完成所有工作,并且还会缓存所有图像。请参阅documentation

如果你不需要你的成功和失败阻止,你可以放弃它。

- (void)setImageWithURL:(NSString *)url
   placeholderImageName:(NSString *)placeholderImage {

    NSURL *url = [NSURL URLWithString:[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    UIImage *pImage = placeholderImage == nil? nil : [UIImage imageNamed:placeholderImage];
    [self setImageWithURL:url placeholderImage:pImage];        
}

答案 1 :(得分:0)

或者图像可能非常大(这与UIImageView大小无关)。 我们能看到您的代码吗? 你从文件系统手动加载它们吗?可能是因为你在主线程中这样做了。 在加载图像的代码中尝试此操作: NSLog(@"这是主线程:%d",[NSThread isMainThread]); 如果你看到1,那就是问题所在。您可以使用GCD解决它(请记住,一旦加载图像,将其移动到主线程)

答案 2 :(得分:0)

使用NSOperationQueue下载图像。在NSOperationQueue中添加新项目时,首先检查它是否已添加。

NSOperation完成后,该图像将保存到本地。

始终从本地加载图片。如果图像不存在于本地,则显示一些占位符。

希望它有所帮助。

此致 Punita