线程问题在ios 7上的表现不同

Blu*_*eni 8 iphone ios

我从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];

}
Run Code Online (Sandbox Code Playgroud)

Tri*_*ops 6

AGIPCGridItem是.的子类UIView.不要在后台线程上使用UIKit对象.

确保你需要后台线程,如果你这样做,只将繁重的任务放到后台.创造一个UIView不应该是那种情况.

此外,不建议PRIORITY_LOW使用简单的使用PRIORITY_DEFAULT.

编辑:如果你很好奇为什么它在iOS 6上工作:这是UIKit的实现细节.它仍然是错的,但不知怎的做了你所期望的.


vin*_*aut 0

我花了相当多的时间来处理这段代码,但找不到合适的解决方案。显然这个问题已经出现在 github 上,并且一个用户提供了修复:

https://github.com/arturgrigor/AGImagePickerController/issues/19

但显然他只是删除了在后台运行的所有块,所以我认为对于大量图像,性能会很差。

我的预感是,dispatch_async 块内部运行调用某些 UIKit 函数的代码,因此行为基本上是未定义的。

例如,在我看来,AGIPGridItem.msetAsset中的函数是在您发布的dispatch_async 内部调用的。它正在调用 UImage,虽然它在锁内,但它仍然应该在后台线程上执行,而所有 UIKit 代码都应该在主线程上执行。

UITableViewCell加载图像和重用单元格

但即使我将调用包装在 a 中, dispatch_async(dispatch_get_main_queue()...)它仍然不起作用。

看来AGIPGridell.m[view removeFromSuperview];的调用在某种程度上是有责任的,但删除它会产生内存泄漏的副作用(毫不奇怪)。 setItems