异步任务可以在循环中运行吗? (在iOS中)

时间:2015-02-05 22:54:17

标签: ios objective-c iphone loops firebase

基本上我正在使用firebase查询用户的'status'属性,并在do / while循环中执行此操作。

如果status属性是空闲的,那么我想打破循环并继续使用该方法的其余部分。如果status属性不是免费的,那么我想再次为新用户查询firebase,直到找到一个空闲用户。

我的firebase代码在循环外工作正常,但似乎没有在其中调用。这是循环:

__block uint32_t rando; 
self.freedom = @"about to check";

do {
//check if free

[self checkIfFree:^(BOOL finished) {

    if (finished) {
        if ([self.freedom isEqualToString:@"free"]) {
            //should break loop here
        }

        else if ([self.freedom isEqualToString:@"matched"]){

            //get another user

            do {
                //picking another random user from array
                rando = arc4random_uniform(arraycount);
            }
            while (rando == randomIndex && rando == [self.randString intValue]);

            self.randString = [NSString stringWithFormat:@"%u", rando];
            [users removeAllObjects];
            [users addObject:[usersArray objectAtIndex:rando]];
            self.freeUser = [users objectAtIndex:0];

            //should repeat check here but doesn't work
        }
        else{
            NSLog(@"error!");
        }
    }
    else{
        NSLog(@"not finished the checking yet");
    }
}];
} while (![self.freedom  isEqual: @"free"]);

这是我的firebase代码:

-(void)checkIfFree:(myCompletion) compblock{

self.freeUserFB = [[Firebase alloc] initWithUrl:[NSString stringWithFormat: @"https://skipchat.firebaseio.com/users/%@", self.freeUser.objectId]];

[self.freeUserFB observeEventType:FEventTypeValue  withBlock:^(FDataSnapshot *snapshot)
 {
     self.otherStatus = snapshot.value[@"status"];

     NSLog(@"snapshot info %@", snapshot.value);

     if ([self.otherStatus isEqualToString:@"free"]) {
         self.userIsFree = YES;
         self.freedom = @"free";
     }
     else{
         self.userIsFree = NO;
         self.freedom = @"matched";             
     }
     compblock(YES);
 }];
}

谢谢!

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解你的问题。 如果您想再次运行完成代码,直到某些条件匹配(在本例中为[self.freedom isEqualToString:@"free"]),您可以执行以下操作(删除do - while):

void( ^ myResponseBlock)(BOOL finished) = ^ void(BOOL finished) {
    if (finished) {
        if ([self.freedom isEqualToString: @"free"]) {
            return;
        } else if ([self.freedom isEqualToString: @"matched"]) {
            //get another user
            do {
                //picking another random user from array
                rando = arc4random_uniform(arraycount);
            }
            while (rando == randomIndex && rando == [self.randString intValue]);
            self.randString = [NSString stringWithFormat: @"%u", rando];
            [users removeAllObjects];
            [users addObject:usersArray[rando]];
            self.freeUser = users.firstObject;

            // Schedule another async check
            [self checkIfFree: myResponseBlock];
        } else {
            NSLog(@"error!");
        }
    } else {
        NSLog(@"not finished the checking yet");
    }
};

[self checkIfFree: myResponseBlock];