在调用layoutSubviews之前,将在UIView上运行的NSOperation启动

时间:2012-05-24 09:43:16

标签: ios multithreading nsoperation nsoperationqueue uiviewanimation

假设我有一个UIView的子类,我将其称为AnimatableView,其中我layoutSubviews的实现列出了一些内部内容。

AnimatableView也有方法commenceAnimationLoop,如下所示:

- (void) commenceAnimationLoop {

    NSOperation *animationLoop = [[AnimationLoopOperation alloc]init];
    [queue addOperation:animationLoop]; //queue is a NSOperationQueue iVar of AnimatableView
    [animationLoop release];
}

AnimationLoopOperationNSOperation的子类,其main方法将启动无限动画,该动画仅在isCancelled属性变为YES后退出。

我遇到的问题出现在ViewController我设置AnimatableView的实例中,如下所示:

- (void) viewDidLoad {
    AnimatableView *animatableView = [AnimatableView alloc]initWithFrame:someFrame];

    [self.view addSubview: animatableView];
    [animatableView commenceAnimationLoop];

    [animatableView release];
}

问题是NSOperation中创建的commenceAnimationLoopAnimatableView的实例有机会调用layoutSubviews之前执行(意味着它的内容尚未发布)生成并布置了。)

我正在做出有根据的猜测,以后会调用layoutSubviews方法(当ViewController准备呈现其视图层次结构时?),但commenceAnimationLoop方法会生成一个线程立即在后台执行。

总结一下 - 在开始之前让animationLoop操作等待视图布局的最佳方法是什么?

为我想要实现的目标提供一些高级上下文 - 我正在使用NSOperation来开始连续动画。我的想法是,我可以提供endAnimation方法,该方法可能会在我的队列中调用cancelAllOperations。所有这一切都是希望我可以通过两种方法commenceAnimationLoopendAnimation提供启动然后中断无限动画的方法。也许我正在沿着多线程路线咆哮错误的树?

1 个答案:

答案 0 :(得分:2)

如果在操作之前需要layoutSubviews运行,则不应该在此之前启动操作队列。您可以使用[myOperationQueue setSuspended:YES];阻止操作队列启动其他操作。

由于它只会阻止队列启动新操作,因此您应该在向其添加操作之前暂停队列。

查看已加载并且layoutSubviews已运行后,您可以使用[myOperationQueue setSuspended:NO];再次恢复操作队列。一个地方可以在viewDidAppear