Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.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
Ios 作为子视图添加后,在GCD全局队列奇数行为中创建UIView_Ios - Fatal编程技术网

Ios 作为子视图添加后,在GCD全局队列奇数行为中创建UIView

Ios 作为子视图添加后,在GCD全局队列奇数行为中创建UIView,ios,Ios,我正在创建一些UIView并缓存它们,原因对于手头的问题并不重要 将视图X作为子视图添加到Y后,其中一个X的子视图不会出现。如果我等20-30秒,它会突然出现 下面是我创建视图并将其添加到缓存中的方法。这些视图尚未添加到ui中,这将在以后发生 dispatch_async(dispatch_get_global_queue(0, 0), ^{ for(int i = 0; i < 10;i++){ MyUIView *cTemp = [[MyUIV

我正在创建一些UIView并缓存它们,原因对于手头的问题并不重要

将视图X作为子视图添加到Y后,其中一个X的子视图不会出现。如果我等20-30秒,它会突然出现

下面是我创建视图并将其添加到缓存中的方法。这些视图尚未添加到ui中,这将在以后发生

dispatch_async(dispatch_get_global_queue(0, 0), ^{

        for(int i = 0; i < 10;i++){
            MyUIView *cTemp = [[MyUIView alloc] initWithFrame:CGRectZero];
            [self addViewToCahce:cTemp forKey:@"key"];  

        }

});
dispatch\u async(dispatch\u get\u global\u队列(0,0)^{
对于(int i=0;i<10;i++){
MyUIView*cTemp=[[MyUIView alloc]initWithFrame:CGRectZero];
[self addViewToCahce:cTemp forKey:@“key”];
}
});

但是,如果我删除
dispatch\u async
,它看起来应该是这样的。有人知道这里发生了什么或者如何防止这种异常行为吗?

永远不要在主线程之外修改UI。Cocoa和大多数UI框架一样,不是多线程的。请尝试以下操作:

dispatch_async(dispatch_get_global_queue(0, 0), ^{
    // Do whatever processing you want to do here
    dispatch_async(dispatch_get_main_queue(), ^{
        for(int i = 0; i < 10;i++){
            MyUIView *cTemp = [[MyUIView alloc] initWithFrame:CGRectZero];
            [self addViewToCahce:cTemp forKey:@"key"];  

        }
    });    
});
dispatch\u async(dispatch\u get\u global\u队列(0,0)^{
//在这里做任何你想做的处理
dispatch\u async(dispatch\u get\u main\u queue()^{
对于(int i=0;i<10;i++){
MyUIView*cTemp=[[MyUIView alloc]initWithFrame:CGRectZero];
[self addViewToCahce:cTemp forKey:@“key”];
}
});    
});

至于你为什么会经历你描述的行为,我只能推测。我不相信构造函数
UIView
是线程安全的。如果您需要在另一个线程中创建视图,如果可能的话,我建议您对代码进行一点重构。

是的,这是:-D我一看到标题就这么想。好的,我将尝试您的更改,看看会发生什么。在该循环过程中,视图不会添加到UI中,它们是稍后在tableviews
cellForRowAtIndexPath
中的单元格创建过程中添加的,是否仍考虑在主线程之外修改UI?我想线程化创建的原因是,视图是在应用程序启动时创建的,如果没有线程化,应用程序将在黑屏上挂起0.5-1秒。请尝试推迟单元格的创建,直到
cellforrowatinexpath
请求。使用
reuseIdentifier
仅创建所需数量的单元格。如果加载数据到缓存的速度较慢,则可以将其卸载,但您应该尽量避免将其加载到视图/单元格本身。啊,好吧,设计要求动态单元格内容,因此我不能使用单个xib并重用它。为了说明这一点,我使用标准的tableview可重用单元作为视图的基础,然后使用辅助可重用视图缓存作为内部单元子视图。因此,最多有3个tableview单元格和10个内部子视图。上面问题中的缓存用于内部子视图,子视图需要0.25-0.5秒才能创建,因此需要在tableview请求单元格之前创建线程化视图。我仍然建议您尝试将缓存的创建(不创建视图)卸载到线程。然后通过从缓存中读取纯数据(无UI)来创建视图。