滚动时更新 UITableViewCell
Posted
技术标签:
【中文标题】滚动时更新 UITableViewCell【英文标题】:Update UITableViewCell while scrolling 【发布时间】:2015-01-06 20:15:44 【问题描述】:我正在尝试将图像从服务器异步加载到单元格。但是滚动时图像不会改变,只有在滚动停止后才会改变。只有在滚动停止后,“加载”消息才会出现在控制台中。我希望图像在滚动时出现在单元格中。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
CustomCell *cell = (CustomCell *)[_tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
ZTVRequest *request = [[ZTVRequest alloc] init];
[request getSmallImg completionHandler:^(UIImage *img, NSError *error)
if (! error)
NSLog(@"loaded")
cell.coverImgView.image = img;
];
return cell;
【问题讨论】:
您的cell.coverImgView.image = omg;
似乎正在后台线程上运行,因此不会立即更新。您必须使用类似的方式将图像加载分配到主队列:dispatch_async(dispatch_get_main_queue(), ^ cell.coverImgView.image = img; )
。见:***.com/q/4944363/558933
没有帮助。我已经添加了答案。
【参考方案1】:
我正在使用 NSURLConnection 加载图像。我在这个答案中找到了解决方案:https://***.com/a/1995318/1561346 by Daniel Dickison
这里是:
在您停止滚动之前不会触发连接委托消息的原因是因为在滚动期间,运行循环位于 UITrackingRunLoopMode
中。默认情况下,NSURLConnection
仅在NSDefaultRunLoopMode
中进行调度,因此您在滚动时不会收到任何消息。
以下是在“普通”模式下安排连接的方法,其中包括UITrackingRunLoopMode
:
NSURLRequest *request = ...
NSURLConnection *connection = [[NSURLConnection alloc]
initWithRequest:request
delegate:self
startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSRunLoopCommonModes];
[connection start];
请注意,您必须在初始化程序中指定 startImmediately:NO
,这似乎与 Apple 的文档背道而驰,该文档建议您即使在启动后也可以更改运行循环模式。
【讨论】:
以上是关于滚动时更新 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章
表更新时 NSFetchedResultsController 无法滚动