2013-10-10 51 views
0

我想更新我的ViewController self.matchedUsers,這從我經歷了塊異步運行查詢所需數據的屬性。如何從異步檢索的數據更新ViewController的屬性?

然後某處以後當我通過[self.matchedUsers count]檢索計數時,儘管知道多個對象已添加到我的屬性中,但仍然得到0。我的問題是,即使當我通過塊異步檢索數據時,如何確保我的屬性得到更新?謝謝!

更新:

爲背景,這裏是塊:

//Way earlier in an initializer: 
self.matchedUsers = [[NSMutableArray alloc] init]; 

//In a method much later 
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
    if (!error){ 
    //Code that updates self.matchedUsers with the NSArray objects 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        [self.matchedUsers addObjectsFromArray: objects]; 
       }); 
    //Question relates to ensure how property could be updated 
    } 
}]; 
+2

你初始化了匹配用戶嗎? – Jano

+1

您確定您正在檢查__此塊已運行嗎? –

+0

使用KVO或委託或NSNotification或黑色回調來通知您的視圖控制器。 –

回答

1

這應該工作只要你沒有忘記初始化matchedUsers,你檢查它的價值,它已經改變,array做後在計劃和執行塊之間不會丟失其元素。

不過,我更願意寫一個可以從任何線程調用的方法,說

- (void)addUser ... 
    @synchronized(self.usersToAdd) { 
      [self.usersToAdd addObjectsFromArray: array]; 
      Enqueue on main thread { 
       NSArray *addingNow; 
       @synchronized(self.usersToAdd) { 
        addingNow = [self.usersToAdd copy]; 
        [self.usersToAdd removeObjects... 
       } 
       if (addingNow.count) { 
        [self.users addObjectsFromArray: addingNow; 
        [self.tableView insertRowsWithIndexPaths... 
       } 
      } 
     } 
} 
+1

謝謝你的解決方案!你能解釋一下更多關於你如何使用'@ synchronized',和...(是那些用於我應該傳入的參數?)以及帶有'tableView'的部分?基本上,如果你可以解釋一些關於你的代碼的話,那會很棒。 – daspianist

+0

我很想理解這一點。 – SAHM

1

正如其他人所寫的問題可能會丟失matchedUsers初始化,但...

。 ..問題也可能是由於您的主線程被阻止。你寫的是你「在某個地方後來檢索計數」。如果這與第一次派遣的方法相同,您將遇到麻煩。考慮下面的代碼

NSMutableArray *collection = [[NSMutableArray alloc] init]; 
dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
    NSArray *array = [[NSArray alloc] initWithObjects:@"1", nil]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     for (NSString *item in array){ 
      [collection addObject:item]; 
     } 
     NSLog(@"A"); 
    }); 
}); 

[NSThread sleepForTimeInterval:5]; 
NSLog(@"B"); 

如果這是在主線程上運行,然後A(不管睡眠時間),它會輸出第一B,因爲塊沒有運行,直到方法完成執行。如果另一方面調度到另一個全局隊列而不是主隊列,則它將是A然後是B.