如何从异步检索的数据更新ViewController的属性?

时间:2013-10-10 19:49:02

标签: iphone ios objective-c objective-c-blocks

我想更新我的ViewController self.matchedUsers的属性,该属性从我通过块异步运行的查询中获取数据。

然后某个地方当我通过[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 个答案:

答案 0 :(得分: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 :(得分: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");

如果它在主线程上运行,它将首先输出B然后A(无论休眠时间),因为在方法完成执行之前块不会运行。另一方面,如果您调度到另一个全局队列而不是主队列,则它将是A,然后是B.