异步任务可以在循环中运行吗? (在iOS中)
基本上我使用firebase来查询用户的'状态'属性,并在do/while循环中这样做。异步任务可以在循环中运行吗? (在iOS中)
如果状态属性是空闲的,那么我想打破循环并继续执行其余的方法。如果状态属性不是空闲的,那么我想再次查询一个新用户的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"]);
这是我的火力代码:
-(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);
}];
}
谢谢!
我不知道我是否正确理解你的问题。 如果您想再次运行完成代码,直到某些条件匹配(在这种情况下[self.freedom isEqualToString:@"free"]
),你可以做以下(去除DO - 一会儿):
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];
感谢您的回应,我会尽快尝试这个。 只是想知道为什么这应该工作,为什么do/while循环不会? 谢谢 – ryder 2015-02-07 00:33:27
我在'checkIfFree'完成块的最后一行发现错误'bad access':'completion(YES)' – ryder 2015-02-07 10:32:00
得到它的工作,感谢您的帮助!看到解决'不良访问'错误http://stackoverflow.com/questions/28388668/bad-access-after-block-within-a-block-is-called-ios – ryder 2015-02-08 01:14:46
旁注:你应该使用枚举或最小命名的字符串常量,而不是像'self.freedom = @“free”;''self.freedom = @“”matched“;'' – 2015-02-05 23:29:41
为什么不添加观察者来查看状态更改时间:FEventTypeChildChanged。那么你可以检查用户状态并将它们添加到免费用户数组中,如果他们是免费的? – 2015-02-06 02:53:57
我不认为这会做这项工作,因为我想在该时间点的价值,所以当前用户可以立即与另一个免费用户匹配。查询的用户类型也根据用户的当前偏好(如tinder)进行更改,因此这需要查看我猜测的所有用户? 另外,我仍然会遇到如果免费用户数组是空的问题,我将不得不再次调用异步的firebase方法我相信 – ryder 2015-02-07 00:28:54