假设我有一个 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
准备好呈现其 View 层次结构时?),但是 commenceAnimationLoop
方法生成一个立即在后台执行的线程。
总而言之 - 制作我的 animationLoop
的最佳方法是什么?操作等待 View 布局后再开始?
为我要实现的目标提供一些高级上下文 - 我正在使用 NSOperation
开始一个连续的动画。我的想法是我可以提供 endAnimation
可能会调用 cancelAllOperations
的方法在我的队列中。所有这些都是希望我能提供一种使用两种方法开始和中断无限动画的方法 commenceAnimationLoop
和 endAnimation
.也许我在沿着多线程的路线咆哮错误的树?
最佳答案
如果您需要 layoutSubviews
在您的操作之前运行,那么您不应在此之前启动操作队列。您可以使用 [myOperationQueue setSuspended:YES];
阻止操作队列启动其他 操作。
因为它只会阻止队列开始新的操作,所以你应该在向队列添加操作之前暂停队列。
在您加载 View 并运行 layoutSubviews
后,您可以使用 [myOperationQueue setSuspended:NO];
再次恢复操作队列。可以在 viewDidAppear
中执行此操作。
关于ios - 在调用 layoutSubviews 之前将在 UIView 上运行的 NSOperation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10734948/