0

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 
   }
 }];
4

2 に答える 2

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 になります。

于 2013-10-10T20:55:00.297 に答える
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...
               }
           }
      }
 }
于 2013-10-10T20:41:18.647 に答える