3

両方のブロックコードが戻ってきたと確信しているときにメソッドを起動するにはどうすればよいですか?そのようです...

// Retrieve Messages Array from Parse
[ParseManager retrieveAllMessagesForShredderUser:(ShredderUser *)[PFUser currentUser] withCompletionBlock:^(BOOL success, NSError *error, NSArray *objects){
        self.messagesArray = objects;
    }];

// Retrieve MessagesPermissions Array from Parse
[ParseManager retrieveAllMessagePermissionsForShredderUser:(ShredderUser *)[PFUser currentUser] withCompletionBlock:^(BOOL success, NSError *error, NSArray *objects){
        self.messagePermissionsArray = objects;
    }];

-(void)methodToRunWhenBothBlocksHaveReturned{
}
4

1 に答える 1

4

ブロックが同じスレッド(つまり、UIスレッド)で実行されることを保証できる場合、代替手段は__block変数を使用する単純です。

-(void)yourMethod {
    __block int count = 0;
    [ParseManager retrieveAllMessagesForShredderUser:(ShredderUser *)[PFUser currentUser] withCompletionBlock:^(BOOL success, NSError *error, NSArray *objects){
        self.messagesArray = objects;
        count++;
        if (count == 2) {
             [self methodToRunWhenBothBlocksHaveReturned];
        }
    }];

    [ParseManager retrieveAllMessagePermissionsForShredderUser:(ShredderUser *)[PFUser currentUser] withCompletionBlock:^(BOOL success, NSError *error, NSArray *objects){
        self.messagePermissionsArray = objects;
        count++;
        if (count == 2) {
             [self methodToRunWhenBothBlocksHaveReturned];
        }
    }];
}

-(void)methodToRunWhenBothBlocksHaveReturned{
}

同じスレッドの保証がない場合は、ロックを使用して、変数の増分(および2との比較)がアトミックであることを確認できます。

于 2013-02-15T17:38:56.373 に答える