我想更新我的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
}
}];
答案 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.