2012-08-25 43 views
0

我有排隊函數的問題。我想運行我的功能,當我的第一個功能完成運行時,我想開始另一個。如何按目標順序運行函數c

-(void)firstFunct 
{ 

// sending and getting information from server. 
// doing sth and creating data to use in my second function. 

} 

和我的第二個功能是:

-(void)secondFunct 
{ 
// using data coming from first function 

} 

我現在在使用這兩個函數一樣,

-(void)ThirdFunct 
{ 

    [self firstFunct]; 

    [self performSelector:@selector(secondFunct) withObject:nil afterDelay:0.5]; 


} 

但有一個問題,這種方法不好用。我想知道是否有一種有效的方法來一個接一個地運行這些功能。

+1

Objective-C使用方法而不是函數。否則,你的代碼將用C語言編寫,如:'void FirstFunction();' – CodaFi

+1

@CodaFi這實際上有些迂腐的區別,大多數程序員知道你的意思,如果你交替使用這些術語。 – millimoose

+3

@millimoose:這不是迂腐。兩者都可以在Objective-C中獲得,它們的語義有很大的不同。明確區分是有用的。 –

回答

3

可可提供很好的併發管理類,如NSOperationNSOperationQueue。您可以使用它們來簡化鏈接異步調用的邏輯,而無需在代碼中創建顯式連接,以便在工作2完成後調用方法3,並在工作1完成後調用方法2,等等。使用依賴管理,您可以輕鬆地指定您的操作之間的這些依賴關係。

下面是如何使用該代碼的簡單示例。假設你正在用這三種方法異步下載一些數據,並且你創建了一個名爲DownloadOperation的子類NSOperation

首先,創建一個NSOperationQueue

然後,創建三個下載操作。

DownloadOperation *a = [[DownloadOperation alloc] init]; 
DownloadOperation *b = [[DownloadOperation alloc] init]; 
DownloadOperation *c = [[DownloadOperation alloc] init]; 

然後,指定您的操作之間的依賴關係。依賴關係只是表示一個操作只有在所有依賴的操作都完成時才能運行。在你的榜樣,依賴樣子c <- b <- a,它可以分爲兩個步驟:

[b addDependency:a]; 
[c addDependency:b]; 

現在添加這些操作的隊列中。

[queue addOperations:@[ a, b, c ] waitUntilFinished:NO]; 

隊列會自動開始在這一點上處理所有的操作,但由於我們創建這個鏈接不大不小的依賴,他們將在我們的例子中執行一個接一個。

我在github上創建了一個示例項目,用一個簡單示例在https://github.com/AnuragMishra/ChainedOperationQueue上進行演示。它通過創建一個定時器來僞造異步操作,當定時器結束時,該操作被標記爲完成。它是使用Xcode 4.5編寫的,因此如果您在舊版本中編譯它時遇到問題,請告訴我。

+0

感謝您的回答。它對我非常有幫助。 – meth

4

你可以簡單地調用一個函數後,其他:

- (void) thirdFunct 
{ 
    [self firstFunct]; 
    [self secondFunct]; 
} 

如果你想在後臺運行這個整個塊,不會阻塞UI線程,使用大中央調度:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_NORMAL, 0), ^{ 
    [self firstFunct]; 
    [self secondFunct]; 
}); 

如果第一個函數包含一些異步調用,那麼該調用在調用完成後應提供某種類型的接口來運行代碼,如委託調用或完成塊。

-2

,如果你寫你的梅索德這樣

-

(void)ThirdFunct 
{ 

    [self firstFunct]; 

    [self secondFunct]; 


} 

secondFunctfirstFunct後調用。您的問題肯定來自異步的網絡請求。爲確保您的secondFunct在異步請求後執行,您必須從委託或代碼塊執行它。 結賬NSURLConnectionDelegate如果你NSURLConnection

4

那麼,是的,zoul的正常情況下的點。

但是,你提到一個服務器被捲入。在這種情況下,你可能有一個異步請求。您想要做的是讀取您用來發出網絡請求的課程的文檔,並瞭解它在完成時通知您使用哪些回調。