1

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

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
}

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

我的问题是

1. is it necessary to using `serial_queue` and `dispatch_sycn`for this situation. 

PS:如果您认为这是一个不好的问题。请评论您对此的看法。

4

2 回答 2

1

首先,您应该看一下生命周期UIViewUIViewController这将告诉您 aUIVie或 a何时UIViewController“准备好使用”。其次,您应该检查何时使用串行查询和 GCD。

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

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

  2. 使用带有主队列的 GCD 在后台队列和主 (UI) 队列之间切换。

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

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

如果您在视图控制器的init方法上做一些复杂的事情,只需将这些复杂的事情放在单独线程上的 GCD 块上。

于 2013-09-03T21:28:21.663 回答
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 行并下到第 2 行

[self addChildViewController:[arrControllers lastObject]];

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

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

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

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

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

或者

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

在 ARC 下,只留下第二行。

希望我理解正确。随意问的问题。

于 2013-09-03T21:37:27.317 回答