我正在使用这个 Project来自 github,它是一个图像选择器。 自 ios7 以来,我不得不做一个非常小的更改,使您相册中的预览图像再次显示,但现在当您离开选择器并返回时,所选照片 (2/5) 重置为 0/5 即使我选择了照片。我该如何解决这个问题?
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)
似乎需要永远更新 ui,即使使用 dispatch_async(dispatch_get_main_queue()
重新加载其中的 ui。当我注释掉 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)
时,图片会立即加载,但其他内容会损坏,这取决于队列。
这是带有 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)
的代码片段 我更改了代码,我更改了注释掉的代码
AGIPCAssetsController.m:
- (void)loadAssets
{
[self.assets removeAllObjects];
__ag_weak AGIPCAssetsController *weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
__strong AGIPCAssetsController *strongSelf = weakSelf;
@autoreleasepool {
[strongSelf.assetsGroup enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
if (result == nil)
{
return;
}
AGIPCGridItem *gridItem = [[AGIPCGridItem alloc] initWithImagePickerController:strongSelf.imagePickerController asset:result andDelegate:strongSelf];
if ( strongSelf.imagePickerController.selection != nil &&
[strongSelf.imagePickerController.selection containsObject:result])
{
gridItem.selected = YES;
}
[strongSelf.assets addObject:gridItem];
}];
}
dispatch_async(dispatch_get_main_queue(), ^{
[strongSelf reloadData];
});
});
[strongSelf reloadData];
}
最佳答案
AGIPCGridItem
是 UIView
的子类。 不要在后台线程上使用 UIKit 对象。
确保你需要后台线程,如果你需要,只将繁重的任务放到后台。创建 UIView
不应该是这种情况。
此外,不建议使用 PRIORITY_LOW
使用简单的 PRIORITY_DEFAULT
。
编辑:如果您好奇为什么它在 iOS 6 上有效:那是 UIKit 的实现细节。它仍然是错误的,但以某种方式达到了您的预期。
关于iphone - 线程问题在 iOS 7 上表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18967054/