假设我有一个UIView
的子类,我将其称为AnimatableView
,其中我layoutSubviews
的实现列出了一些内部内容。
AnimatableView
也有方法commenceAnimationLoop
,如下所示:
- (void) commenceAnimationLoop {
NSOperation *animationLoop = [[AnimationLoopOperation alloc]init];
[queue addOperation:animationLoop]; //queue is a NSOperationQueue iVar of AnimatableView
[animationLoop release];
}
AnimationLoopOperation
是NSOperation
的子类,其main
方法将启动无限动画,该动画仅在isCancelled
属性变为YES
后退出。
我遇到的问题出现在ViewController
我设置AnimatableView
的实例中,如下所示:
- (void) viewDidLoad {
AnimatableView *animatableView = [AnimatableView alloc]initWithFrame:someFrame];
[self.view addSubview: animatableView];
[animatableView commenceAnimationLoop];
[animatableView release];
}
问题是NSOperation
中创建的commenceAnimationLoop
在AnimatableView
的实例有机会调用layoutSubviews
之前执行(意味着它的内容尚未发布)生成并布置了。)
我正在做出有根据的猜测,以后会调用layoutSubviews
方法(当ViewController
准备呈现其视图层次结构时?),但commenceAnimationLoop
方法会生成一个线程立即在后台执行。
总结一下 - 在开始之前让animationLoop
操作等待视图布局的最佳方法是什么?
为我想要实现的目标提供一些高级上下文 - 我正在使用NSOperation
来开始连续动画。我的想法是,我可以提供endAnimation
方法,该方法可能会在我的队列中调用cancelAllOperations
。所有这一切都是希望我可以通过两种方法commenceAnimationLoop
和endAnimation
提供启动然后中断无限动画的方法。也许我正在沿着多线程路线咆哮错误的树?
答案 0 :(得分:2)
如果在操作之前需要layoutSubviews
运行,则不应该在此之前启动操作队列。您可以使用[myOperationQueue setSuspended:YES];
阻止操作队列启动其他操作。
由于它只会阻止队列启动新操作,因此您应该在向其添加操作之前暂停队列。
查看已加载并且layoutSubviews
已运行后,您可以使用[myOperationQueue setSuspended:NO];
再次恢复操作队列。一个地方可以在viewDidAppear
。