gpt4 book ai didi

ios - NSOperation 获取图像并更新 UITableView UIImageView 属性

转载 作者:行者123 更新时间:2023-11-29 13:11:06 27 4
gpt4 key购买 nike

我创建了一个继承自 NSOperation 的 fetchImageOperation 类。它使用 URL 获取图像,然后在完成后触发 block 。我的问题是,如果我有以下代码:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

Customer *customer = [_customers objectAtIndex:[indexPath row]];

FetchImageOperation *imageOperation = [[FetchImageOperation alloc] initWithURL:[NSURL URLWithString:vegetable.imageURL]];

cell.nameLabel.text = customer.name;

imageOperation.fetchImageOperationCompletionBlock = ^(UIImage *image)
{
[cell.thumbnailImageView setImage:image];
};

[_queue addOperation:imageOperation];

return cell;
}

setImage方法默认是在主线程(UI Thread)上调用的吗?我可以确认上面的代码有效,它确实设置了 thumbnailaImageView 元素的图像属性。

FetchImageOperation.m 文件:

@implementation FetchImageOperation

-(id) initWithURL:(NSURL *)url
{
self = [super init];
self.url = url;
return self;
}


-(void) main
{
NSData *data = [NSData dataWithContentsOfURL:_url];
UIImage *image = [UIImage imageWithData:data];

if(self.fetchImageOperationCompletionBlock != nil)
{
self.fetchImageOperationCompletionBlock(image);
}
}

@end

最佳答案

绝不会在主线程上自动调用任何 UI 方法。在这种情况下,它将在您的 NSOperation 子类的 main 方法运行的任何线程上调用。

你应该使用像

这样的东西
dispatch_async(dispatch_get_main_queue(), ^{
if(self.fetchImageOperationCompletionBlock != nil) {
self.fetchImageOperationCompletionBlock(image);
}
});

如果您想保证所有 fetchImageOperationCompletionBlock 都在主线程上触发。由于单元格的重用,您不希望调用单元格本身的属性,而是将索引路径保存到 block 中的单元格,然后使用该索引路径处的单元格,或其他。

关于ios - NSOperation 获取图像并更新 UITableView UIImageView 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17353927/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com