ios - 在调用 layoutSubviews 之前将在 UIView 上运行的 NSOperation

标签 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创建于 commenceAnimationLoop在我的 AnimatableView 实例之前执行有机会调用layoutSubviews (这意味着它的内容尚未生成和布局)。

我有根据地猜测 layoutSubviews稍后调用方法(当 ViewController 准备好呈现其 View 层次结构时?),但是 commenceAnimationLoop方法生成一个立即在后台执行的线程。

总而言之 - 制作我的 animationLoop 的最佳方法是什么?操作等待 View 布局后再开始?

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

最佳答案

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

因为它只会阻止队列开始新的操作,所以你应该在向队列添加操作之前暂停队列。

在您加载 View 并运行 layoutSubviews 后,您可以使用 [myOperationQueue setSuspended:NO]; 再次恢复操作队列。可以在 viewDidAppear 中执行此操作。

关于ios - 在调用 layoutSubviews 之前将在 UIView 上运行的 NSOperation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10734948/

相关文章:

ios - 从 Firestore 加载图像并将其保存到 Swift 中的缓存

ios - App Store 的存档 IPA 大小大于 Ad Hoc

c# - 我可以让我的线程池创建它的线程作为前台吗?

java - 单 Java 线程运行时的双核 CPU 利用率

ios - 当 viewWillDisappear 时 NSOperationQueue cancelAllOperations 不起作用

multithreading - NSOperationQueue,NSOperation

iphone - NSOperationQueue、内存和GCD;如何正确实现?

iphone - 是否可以从 url 下载低分辨率图像?

ios - UIImageView 设置HighlightedImage : does it have to be on main thread?

java - 使用 java.text.Collat​​or 并发排序时如何避免线程阻塞?