0

假設我有一個UIView的子類,我將調用AnimatableView,其中我的layoutSubviews的實現部署了一些內部內容。調用layoutSubviews之前將在UIView上運行的NSOperation

AnimatableView也有方法commenceAnimationLoop這看起來是這樣的:

- (void) commenceAnimationLoop { 

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

AnimationLoopOperation是其main方法將啓動無限動畫只有一次isCancelled財產變成YES退出的NSOperation一個子類。

我遇到的問題是在我的ViewController,我的設置和動畫的AnimatableView一個實例,像這樣:

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

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

    [animatableView release]; 
} 

的問題是,在commenceAnimationLoop創建NSOperation執行我的AnimatableView實例已收到機會致電layoutSubviews(這意味着它的內容尚未生成和佈局)。

我想提出一個受過教育的猜測,layoutSubviews方法後來被稱爲(當ViewController準備呈現其視圖層次?),但該方法commenceAnimationLoop產生一個線程立即在後臺執行。

總結 - 在開始之前,什麼纔是使我的animationLoop操作等待視圖佈局的最佳方式?

爲我想要實現的目標提供一些高級環境 - 我正在使用NSOperation開始連續動畫。我的想法是,我可以提供一個endAnimation方法,可能會在我的隊列上調用cancelAllOperations。所有這些都是希望我能夠提供一種啓動方式,然後用兩種方法commenceAnimationLoopendAnimation中斷無限動畫。也許我正在吠叫走多線程路線的錯誤樹?

+1

如果您需要layoutSubviews在您的操作之前運行,那麼您不應該啓動操作隊列(使用'setSuspended:YES'),直到它完成。你可以在'viewDidAppear'中啓動操作隊列('setSuspended:NO')... –

+0

上面的工作,它也是一個非常簡單的解決方案。添加它作爲答案,我會接受它。 – Barjavel

回答

2

如果您需要layoutSubviews在您的操作之前運行,那麼在此之前您不應該啓動操作隊列。您可以使用[myOperationQueue setSuspended:YES];防止啓動附加操作的操作隊列。

因爲它只會阻止隊列開始新的操作,所以在添加操作之前應暫停隊列。

在您查看已裝載並且layoutSubviews已運行後,您可以使用[myOperationQueue setSuspended:NO];再次恢復操作隊列。一個地方可以在viewDidAppear

相關問題