2014-10-26 75 views
0

首先之前完成,我用故事板,解析後端和Objective-C程序(iOS 8項目)等待解析查詢更新UI

我有一個得到了從下載特定列視圖控制器當前打開的行。我也在這個ViewController中有一個容器發送一個新的查詢,但是這個查詢需要VC1中的列值。由於在容器啓動之前不會下載,所以會嘗試與(null)進行比較時引發異常。

像這樣:(valueFromMainVC爲空,直到VC1下載完畢)

[query whereKey:@"MyColumn" equalTo:valueFromMainVC]; 

這種情況發生在 - (PFQuery *)queryForTable方法

-(PFQuery *)queryForTable { 
} 

我該如何解決這個問題?我嘗試使用while(){}語句,以便在下載valueFromMainVC之前不會開始,但是我沒有取得任何成功。

(我用辛格爾頓到ViewControllers之間共享valueFromMainVC。以及其他值)

幫助深表感謝!

謝謝! Erik

回答

0

我已經在一些項目上使用了Parse,並且我已經使用策略三@Duncan提到了很好的成功。我會等待第一個VC加載,然後使用完成塊調用Parse查詢來更新列值,然後在成功查詢的完成塊中加載子視圖。這可防止在完成數據查詢之後加載子VC。希望這可以幫助!

- (void)viewDidLoad { 
    self.functionToLoadData(); 
} 

-(void)functionToLoadData { 
    PFQuery *query = [PFQuery queryWithClassName:@"invites"]; 
    [query whereKey:@"MyColumn" equalTo:valueFromMainVC]; 
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error){ 
     if (error) { 
      NSLog(@"Error retrieving objects"); 
     } else { 
      // Update necessary variables/fields and load your child view as necessary 
     } 
    }]; 
} 
+0

不知道我明白。我有一個VC的子VC在一個容器中,一旦父VC加載後加載。然後它會嘗試與下載之前應用中尚未存在的內容進行比較。你能否詳細說明你的意思,以及這將如何工作?我想到的一種解決方案是,根據請求以不同的方式在容器上調用viewDidLoad(這將在valueFromMainVC下載的完成塊中調用),而不是一次啓動的容器 – Erik 2014-10-30 19:18:38

+0

對不起,如果我混淆了,請告訴我我仍然無法正確理解。假設我上面提供的代碼在你的第一個VC中運行,我提供的函數查詢原始VC所需的數據,並且在數據查詢完成併成功返回之前,它不會啓動子VC。你可以把代碼放在我的代碼中'else'語句中啓動子VC。 – dstefanis 2014-10-30 19:49:30

+0

沒問題;)現在我明白你的意思了,那也是我的想法。如何根據要求而不是立即「啓動」容器? – Erik 2014-10-30 19:59:24

0

我以前沒有使用Parse,所以我的答案將是一般的。您可能需要編輯您的問題,並在標題中添加「解析」:「等待解析查詢在更新UI之前完成」或類似的內容。 (這樣,具有Parse經驗的人會看到它,並且更可能打開您的問題)

庫有幾種方法可用於處理異步代碼。

幾乎所有這些都涉及到你的想法。你不會編寫等待循環發生的代碼。而是顯示某種佔位符,將控制權交還給用戶,並且數據庫被讀取時,庫會通知您。

一種有點不合時宜的方法是在庫中定義委託屬性。一旦數據被讀取,庫就使用特定的協議向代理髮送消息

處理這種情況的另一種方式是使用通知中心(NSNotificationCenter)。您爲特定消息添加觀察者,並且數據庫準備就緒後,庫會發送特定通知。

新代碼的第三種也是最常用的方法是調用庫中的一個方法來獲取完成塊。完成塊是在數據可用之前不會執行的代碼。你設置你的用戶界面來顯示一個佔位符,你傳入的代碼塊會在數據更新到可用的UI中。