1

所以我正在尝试为自定义 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];

我正在尝试将 Avatar 更改为另一个图像,并且我没有使用从网络中提取的图像,而只是我在本地存储的图像(用于缩小图像更新问题的范围)。

所以如果我把

 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 块内,图像不会更新。但是,如果我将完全相同的代码放在块之外,它会更新图像。我觉得我在 Blocks 的工作方式上遗漏了一些东西。我该如何解决?

谢谢!

4

1 回答 1

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 代码应始终在主线程上运行。

于 2013-05-16T20:58:14.910 回答