2013-08-27 30 views
0

我目前有以下兩種方法,第一種方法僅在用戶是新用戶時通過將用戶首選項保存到雲來執行初始設置,第二種方法每當用戶通過基於用戶的偏好執行查詢來使用應用程序時被調用。確保塊內的方法在調用另一個方法之前完成執行

[self doInitialSetupsForNewUser]; //Only happens for new user. Performs query on a block 
[self getUserPrefsAndDoStuff]; //For all users 

雖然getUserPrefsAndDoStuff正常工作的方法,它失敗如果用戶是全新的,設置方法必須首先調用來完成其工作。裏面doInitialSetupsForNewUser,我使用塊進行下面的調用給Facebook:

FBRequest *request = [FBRequest requestForMe]; 
[request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
     if (!error){ ... } 
}]; 

我的問題是,由於塊結構,getUserPrefsAndDoStuff過早稱爲用戶的喜好下載和doInitialSetupsForNewUser保存在塊之前,和因此拉錯了數據。如何確保設置塊在getUserPrefsAndDoStuff之前完成執行。

回答

2

如果您修改doInitialSetupsForNewUser採取其自己的完成塊,那麼它很容易做。它看起來像這樣。

- (void)doInitialSetupsForNewUser:(void (^)(BOOL, NSError *))completion 
{ 
    FBRequest *request = [FBRequest requestForMe]; 
    [request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
     if (!error){ 
      ... 
      completion(YES, nil); 
     } else { 
      completion(NO, error); 
     } 
    }]; 
} 

然後,您只需更改調用它的代碼,以便使用完成塊來獲取首選項。

if (newUser) { 
    [self doInitialSetupsForNewUser:^(BOOL success, NSError *error) { 
     if (success) 
      [self getUserPrefsAndDoStuff]; 
     else 
      NSLog(@"oh no! %@", error); 
    }]; 
} 
else { 
    [self getUserPrefsAndDoStuff]; 
} 
+0

很好的答案,但有doInitialSetupsForNewUser傳遞一些成功的概念,也許(BOOL成功,NSError *錯誤)。 – danh

+0

完美,優雅的解決方案! @danh - 你是否介意修改答案以通過包含成功的概念來展示你的意思?我對iOS非常陌生,所以具體的例子有很大的幫助 - 謝謝你們兩位! – daspianist

+1

@daspianist好的。我在沒有編譯器的情況下進行了編輯,但它通過了桌面檢查。 – danh

相關問題