2010-02-06 113 views
4

我正在使用Facebook iPhone SDK編寫一個簡單的應用程序。在Facebook的代碼主要是異步的,我開始操作,並在委託調用異步接收響應:如何處理異步麪條代碼?

- (void) doSomething { 
    [FBSomething startOperationWithDelegate:self]; 
} 

- (void) fbOperationFinished: (FBSomething*) operation {…} 

常常有一個給定的操作的多個實例(比如FBRequest)使用相同的回調。這意味着我必須將條件子句放入回調處理程序中才能知道哪些操作已完成。

這會導致混亂,一種「異步的意大利麪代碼」怪物,因爲代碼充滿條件,幾乎不可能看到程序流程邏輯。有沒有更好的方法來編寫這樣的代碼? (可惜我們在iPhone上沒有塊。)我想過介紹一個簡單的狀態機,但我不確定它會有幫助。

回答

10

我不熟悉Facebook SDK,但是您可以創建一個子類,爲您需要Facebook的每個特定任務實現FBRequestDelegate協議(如果它的調用方式如此)。這樣,您就說5個類實現- fbOperationFinished:而不是一個類,其中有5個不同的執行路徑由if s或switch es隔開。

+0

+1是的,這是做它的方式。如果任務足夠離散以需要大量分支,則它們足夠分散以便被封裝在自己的類中。請記住,代表附加到實例,而不是類。根據需要,您可以擁有儘可能多的委託實例。 – TechZen 2010-02-06 14:07:18

+0

問題在於任務本身並不足夠離散,需要解耦成單獨的類。如果代碼是同步的,則幾乎不會有分支。我很猶豫要創建多個類並共享成員變量,以獲得體面的程序流。 – zoul 2010-02-06 15:02:11

+0

...但是,是的,你說得對,這會做。 – zoul 2010-02-06 15:13:57

1

(這是我們沒有對 iPhone。塊恥辱)

您可以使用大括號不帶符號的視覺塊。例如,動畫塊沒有視覺結構,但可以像這樣提供:

// ...some code 
[UIView beginAnimations:@"selectionAnimation" context:nil];{ 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDuration:0.1]; 
    [UIView setAnimationRepeatCount:1]; 
    [UIView setAnimationRepeatAutoreverses:YES]; 
    { //start properties to animate 
     self.transform=CGAffineTransformScale(self.transform, 1.1, 1.1); 
    } // end properties to animate 
    [UIView commitAnimations]; 
} 
// more code... 

這不是一個邏輯塊,但它總比沒有好。您也可以使用它們來摺疊代碼。我用它們來隱藏斷言或調試代碼。

+1

@ TechZen:「塊」是蘋果對「閉包」的一個奇怪術語。 – kennytm 2010-02-06 14:57:58

+0

對不起,我在'關閉'和'塊'之間猶豫了一秒鐘。有誰知道他們爲什麼選擇另一個詞來表達已經被廣泛接受的名字? – zoul 2010-02-06 15:00:59

+0

這與塊沒有任何關係。 – 2010-02-06 15:40:51

3

沒有必要繼承Facebook API對象。我強烈建議不要這樣做。

所有的facebook對象都有一個userInfo字段,您可以使用它來存儲特定於請求的信息。因此,您可以在其中存儲某些內容以識別請求,甚至可以引用處理請求的對象。

這比Cocoa框架的風格更清潔和更多。

0

我會把這些請求放到一個NSOperationQueue中,這會讓每一個都不同,並且同時節流你一次有多少活動。

你只需要請求包成的NSOperation對象(Facebook的API可能已經?)