使用GCD在后台创建UIKit对象是一种不好的做法吗?

时间:2013-08-27 22:30:50

标签: ios objective-c cocoa-touch uikit grand-central-dispatch

正如bbum here所指出的那样, doc说:“在大多数情况下,UIKit类只能在应用程序的主线程中使用。对于派生类UIResponder尤其如此,或者以任何方式操纵应用程序的用户界面。“。

我认为我理解无法在后台线程中调用绘图方法,因此可以在后台完成创建,因为只在添加视图时调用drawRect方法。但也许我错了。

总之,这种代码有风险吗?

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

            dispatch_async(queue, ^{

                NSString *fileName = [pathToModel  stringByAppendingPathComponent:[[compDico valueForKey:@"fileName"] lastPathComponent]];

                UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:
                                                                             fileName]];
                UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(10, 62, 190, 20)];
                [label setText:[[someArray objectAtIndex:i-1] someText]];
                [label setNumberOfLines:0];
                label.font=[UIFont fontWithName:@"arial" size:10.0f];
                [label setBackgroundColor:[UIColor clearColor]];

                // Create some other view here
                // ...

                dispatch_async(dispatch_get_main_queue(), ^{
                    [self.view addSubview:imageView];
                    [self.view addSubview:label];
                    //Add other view here
                    // ...
                });
            });

提前感谢您的回复!

1 个答案:

答案 0 :(得分:4)

是的,这有风险。只有苹果开发人员才能说它有多大风险。

如果文档说“不要使用它”,请不要使用它。

请注意,许多UI对象可以(并且确实)使用共享资源。如果您在后台线程中使用它们,您将在共享资源上获得竞争条件,并且可能发生任何事情。