- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在表格 View 中填充相机胶卷中的图像。
在 ViewDidLoad
中,我创建了一个 Assets 组。
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.delegate = self;
self.tableView.dataSource = self;
self.assetsLibrary = [[ALAssetsLibrary alloc] init];
[self.assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if(nil!=group){
[group setAssetsFilter:[ALAssetsFilter allPhotos]];
self.assetGroup = group;
NSLog(@"%d images found", self.assetGroup.numberOfAssets);
}
} failureBlock:^(NSError *error) {
NSLog(@"block fucked!");
}];
[self.tableView reloadData];
}
在 CellForRowAtIndexPath
中,我使用 GCD 后台队列在相应索引处用图像填充单元格。
static NSString *CellIdentifier = @"Cell";
dispatch_queue_t imgLoadQueue = dispatch_queue_create("Thumb loader", NULL);
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
dispatch_async(imgLoadQueue, ^{
[self.assetGroup enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:indexPath.row] options:0 usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
if (nil != result) {
ALAssetRepresentation *repr = [result defaultRepresentation];
UIImage *img = [UIImage imageWithCGImage:[repr fullResolutionImage]];
cell.imageView.image = img;
}
}];
});
return cell;
问题是,初始单元格是空的。图像仅在我开始滚动后才开始加载。而且,我一滚动应用程序就会崩溃。我是 GCD 的新手,似乎没有正确使用它。感谢您在此问题上提供的任何帮助。
最佳答案
在 viewDidLoad
中的枚举 block 完成并且 self.assetGroup
已填充后,您需要调用 [self.tableView reloadData]
。枚举 block 是异步执行的,因此在 block 完成之前调用 reloadData,并且在 TableView 委托(delegate)回调中,您的 assetGroup 不包含任何数据。当您开始滚动时,该属性已填充并且您开始看到图像。
我还没有看到解释如何检测枚举 block 结束的苹果文档,但是这两个被接受的答案表明当枚举结束时组值将为 nil。
iPhone enumerateGroupsWithTypes finishing selector Find out when my asynchronous call is finished
所以在你的组枚举 block 中添加一个 else 条件 -
if(nil!=group){
[group setAssetsFilter:[ALAssetsFilter allPhotos]];
self.assetGroup = group;
NSLog(@"%d images found", self.assetGroup.numberOfAssets);
}
else
[self.tableView reloadData];
删除在枚举 block 之后调用的 reloadData。
尝试将 CellForRowAtIndexPath 中的枚举 block 从 GCD 队列中取出。该 block 也将异步执行。无需将其分派(dispatch)到后台队列。
关于ios - 使用相机胶卷图像填充表格 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16873370/
我是一名优秀的程序员,十分优秀!