延迟加载用户图像UITableView - 更新请求块中的图像不起作用

时间:2013-05-16 20:37:19

标签: objective-c uitableview lazy-loading objective-c-blocks afnetworking

所以我试图为自定义UITableView(BubbleTableView)延迟加载用户图片

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
                [request setHTTPMethod:@"GET"];

                AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request imageProcessingBlock:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {

                    NSLog(@"Success");
                    UIBubbleTableViewCell *cell = (UIBubbleTableViewCell *)[self.bubbleTableView cellForRowAtIndexPath:indexPath];
                    NSBubbleData *data = [[NSBubbleData alloc] init];
                    data = [cell data];
                    data.avatar = [UIImage imageNamed:@"send.png"];
                    [self.profileImages setObject:image forKey:[self.commUsers objectAtIndex:x]];
                    //Success
                    [cell setData:data];

                } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
                    //Failed
                    NSLog(@"ERROR: %@", response);
                }];

                [operation start];

我正在尝试将“阿凡达”更改为另一张图片而我没有使用从网络中提取的图像而只是我本地存储的图像(为了缩小图像更新问题)。

所以,如果我把

 UIBubbleTableViewCell *cell = (UIBubbleTableViewCell *)[self.bubbleTableView cellForRowAtIndexPath:indexPath];
                NSBubbleData *data = [[NSBubbleData alloc] init];
                data = [cell data];
                data.avatar = [UIImage imageNamed:@"send.png"];
                [self.profileImages setObject:image forKey:[self.commUsers objectAtIndex:x]];
                //Success
                [cell setData:data];

在AFImageRequestOperation块内,图像不会更新。但是,如果我在Block之外放置完全相同的代码,它会更新图像。我觉得我错过了有关Blocks如何工作的东西。我该如何解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

尝试在主线程上的块中运行UI代码:

if ([NSThread isMainThread]) {
    // We're currently executing on the main thread.
    // We can execute the block directly.
    createBubbleTableViewCell();
  } else {
   //non-blocking call to main thread
   dispatch_sync(dispatch_get_main_queue(), createBubbleTableViewCell);
}

检查你是否在主线程上只是为了防止死锁。您也可以使用dispatch_async来阻止呼叫。

UI代码应始终在主线程上运行。