0

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

在我将视图 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_async它,它应该会出现。任何人都知道这里发生了什么或如何防止这种异常行为?

4

1 回答 1

2

切勿在主线程之外修改 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"];  

        }
    });    
});

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

于 2012-09-20T17:16:17.983 回答