是否有必要在这里使用dispatch_queue

时间:2013-09-03 21:08:15

标签: ios objective-c multithreading thread-safety grand-central-dispatch

希望这是一个适当的问题。我的目标是

1.add a controller into an array name 'arrControllers'
2.access and get current controller from 'arrControllers' to do sth with it

我想在访问和使用之前确保arrControllers准备就绪。这就是我使用serial queuedispatch_sycn之类的原因。

-(void)viewDidLoad
{        
    [super viewDidLoad];        
    firstViewController =   [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];        
    [self setUpWithView:firstViewController];

}

并且setUpWithView:

-(void)setUpWithView:(UIViewController*)viewController {
    dispatch_queue_t    queue;
    queue   = dispatch_queue_create("my queue", NULL);

    containerController         =   [ContainerViewController sharedContainerController];

    // What I am taking about is from now on
    dispatch_sync(queue, ^{
        [containerController initWithRootViewController:viewController];

    });

    dispatch_sync(queue, ^{
        [containerController setUpView];

    });



}

initWithRootViewController:

- (void)initWithRootViewController:(UIViewController*)rootViewController {
    arrControllers                  =   [[NSMutableArray alloc] init];
    arrControllers                  =   [NSMutableArray arrayWithObject:rootViewController];

}

setUpView

 -(void)setUpView {     
     /* Process to ADD currentController TO hierarchy */
     [self addChildViewController:[arrControllers lastObject]];
     ............................................................
}

据我所知,编译器将逐行执行代码,这意味着执行以下操作

-(void)setUpWithView:(UIViewController*)viewController {
    containerController         =   [ContainerViewController sharedContainerController];

    // Not using serial_queue and dispatch_sync
    [containerController initWithRootViewController:viewController];// line1
    [containerController setUpView]; //line2
}

编译器将执行line2,直到它在第1行完成任务。

我的问题是

1. is it necessary to using `serial_queue` and `dispatch_sycn`for this situation. 
PS:如果你认为这是一个不好的问题。请评论你对它的看法。

2 个答案:

答案 0 :(得分:1)

首先,您应该查看UIViewUIViewController生命周期,这会告诉您UIVieUIViewController何时“准备就绪用过的”。其次,你应该检查串口问题和GCD的使用时间。

对于第二点,我可以给你一个简短的总结,因为它比第一点更快。

  1. 如果您想在后台线程上执行计算或其他不涉及UI更改的内容而不冻结UI,请使用CGD和队列(其他主队列除外)。

  2. 将GCD与主队列一起使用,以在后台队列和主(UI)队列之间切换。

  3. 必须在主线程上执行所有UI操作。

  4. 因此,在您的情况下,您希望创建一个视图控制器并将其存储到一个数组中,因此作为建议,视图控制器的所有UI相关调用都应该在UI线程上执行,因此不需要GCD或背景线程。

    如果你在视图控制器的init方法上做了一些复杂的事情,只需将这些复杂的东西放在一个分离的线程上的GCD块上。

答案 1 :(得分:1)

在这种情况下,如果您不使用dispatch_sync,您将得到您所需要的:

-(void)setUpWithView:(UIViewController*)viewController {
    containerController         =   [ContainerViewController sharedContainerController];

    // Not using serial_queue and dispatch_sync
    [containerController initWithRootViewController:viewController];// line1
    [containerController setUpView]; //line2
}

第1行将执行initWithRootViewController:,更深入并执行行

arrControllers                  =   [[NSMutableArray alloc] init];
arrControllers                  =   [NSMutableArray arrayWithObject:rootViewController];

然后它将从此功能返回上一级并继续,移至第2行并向下行

[self addChildViewController:[arrControllers lastObject]];

也。永远不要写这样的代码

arrControllers                  =   [[NSMutableArray alloc] init];
arrControllers                  =   [NSMutableArray arrayWithObject:rootViewController];

第一行创建一个空的NSMutableArray,并将指向它的指针分配到arrControllers中。 第二行创建另一个数组(自动释放)并再次在arrControllers中为其指定一个指针。因此,第一行中创建的数组链接将丢失,并在手动内存管理下泄露。

如果使用手动内存管理,请执行以下操作:

arrControllers = [[NSMutableArray alloc] init];
[arrControllers addObject:rootViewController];

OR

arrControllers = [[NSMutableArray alloc] initWithObjects:rootViewController,nil];

在ARC下只留下第二行。

希望我能正确理解你。随意提问。