Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 线程问题在ios 7上的作用不同_Iphone_Ios - Fatal编程技术网

Iphone 线程问题在ios 7上的作用不同

Iphone 线程问题在ios 7上的作用不同,iphone,ios,Iphone,Ios,我使用的是github的这个,它是一个图像选择器。自ios7以来,我不得不做了一个非常小的更改,以使相册中的预览图像再次显示,但现在有了这个更改,当您离开拾取程序并返回到拾取程序时,所选照片(2/5)重置为0/5,即使我选择了照片。我怎样才能解决这个问题 dispatch\u async(dispatch\u get\u global\u queue(dispatch\u queue\u PRIORITY\u LOW,0)似乎要花很长时间才能更新ui,即使使用dispatch\u async(d

我使用的是github的这个,它是一个图像选择器。自ios7以来,我不得不做了一个非常小的更改,以使相册中的预览图像再次显示,但现在有了这个更改,当您离开拾取程序并返回到拾取程序时,所选照片(2/5)重置为0/5,即使我选择了照片。我怎样才能解决这个问题

dispatch\u async(dispatch\u get\u global\u queue(dispatch\u queue\u PRIORITY\u LOW,0)
似乎要花很长时间才能更新ui,即使使用
dispatch\u async(dispatch\u get\u main\u queue()
来重新加载其中的ui。当我注释掉
dispatch\u async(dispatch\u get\u global\u queue(dispatch\u PRIORITY\u LOW,0)
图片会立即加载,但其他东西会被破坏,这取决于队列

这是带有
dispatch\u async(dispatch\u get\u global\u queue(dispatch\u queue\u PRIORITY\u LOW,0)
的代码片段,我更改了,注释掉了更改的代码

AGIPCastController.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];

}

我花了很多时间编写这段代码,但找不到合适的解决方案。显然,github上出现了这个问题,一位用户提供了一个修复方案:

但显然,他只是删除了背景中运行的所有块,所以我认为对于大量图像来说,性能会很差

我的直觉是在dispatch_async块中运行调用某些UIKit函数的代码, 因此,这种行为基本上没有定义

例如,在我看来,AGIPGridItem.m中的
setAsset
函数在您发布的dispatch\u async中被调用。它正在调用UImage,尽管它在锁中,但仍应在后台线程上执行,而所有UIKit代码都应在主线程上执行

但是,即使我将调用包装在
dispatch\u async(dispatch\u get\u main\u queue()…)中,
它也不起作用


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

全局调度队列是一个共享资源。
调度队列优先级低
任务在队列中以更高优先级运行的每个其他任务之后运行。如果队列以更高优先级提交了大量块,则您的
调度队列优先级低
任务可能无法运行很长时间

这记录在以及libdispatch中


因此,基本上,其他高优先级任务会让事情忙起来,而您的低优先级任务没有机会执行。

AGIPCGridItem
UIView
的子类,不在后台线程上处理UIKit对象。

确保您需要后台线程,如果需要,则只将繁重的任务放到后台。不应创建
UIView

此外,不建议使用
PRIORITY\u LOW
使用simple
PRIORITY\u DEFAULT


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

我强调了iMartin的回答“AGIPCGridItem是UIView的子类。不要在后台线程上使用UIKit对象。”他明白了

在将iOS6移动到7时,我遇到了一个非常类似的问题。我在后台线程中发送了一个ALAssets请求。提取完成后,我将构造UIImageView、UILabel和包装器,然后将此对象发送到主/前台线程进行渲染。这在iOS6上运行良好,但在7上,它在大约20秒内没有绘制。它有时会像触摸一样在UI事件之后绘制


修复方法是在背景中获取图像集,将其发送到我创建图像视图的主线程,等等。现在效果非常好。

问题是什么?@Benoit我想知道如何更新拾取程序以了解选择了多少张照片。在我删除调度之前,它正确地执行了此操作,但需要删除调度才能将其发送到w在ios7中正常工作我尝试过这个类,但即使在我使用你的修复程序时,它也不会显示任何图像。你可能想更深入地了解这里的根本问题是什么,你试图做的是一个解决方法,而不是正确的修复。@lawicko是的,我发现我需要将
dispatch\u async
保存在那里,但我不明白为什么s出现在ios6中,但它们需要花费很长时间才能出现在ios6中ios7@BluGeni那么你说它们最终会出现?我建议更新原来的问题。全局队列是一个共享资源。应用程序中或系统中的其他内容(可能在iOS 7中发生了更改)可能会尝试在其中调度优先级更高的任务例如,如果您有一个UIWebView,它可能会以更高的优先级安排任务。