希望这是一个适当的问题。我的目标是
1.add a controller into an array name 'arrControllers'
2.access and get current controller from 'arrControllers' to do sth with it
我想在访问和使用之前确保arrControllers
准备就绪。这就是我使用serial queue
和dispatch_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:如果你认为这是一个不好的问题。请评论你对它的看法。
答案 0 :(得分:1)
首先,您应该查看UIView
和UIViewController
生命周期,这会告诉您UIVie
或UIViewController
何时“准备就绪用过的”。其次,你应该检查串口问题和GCD的使用时间。
对于第二点,我可以给你一个简短的总结,因为它比第一点更快。
如果您想在后台线程上执行计算或其他不涉及UI更改的内容而不冻结UI,请使用CGD和队列(其他主队列除外)。
将GCD与主队列一起使用,以在后台队列和主(UI)队列之间切换。
必须在主线程上执行所有UI操作。
因此,在您的情况下,您希望创建一个视图控制器并将其存储到一个数组中,因此作为建议,视图控制器的所有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下只留下第二行。
希望我能正确理解你。随意提问。