기본적으로 사용자의 '상태'속성을 쿼리하고 do/while 루프에서 firebase를 사용하고 있습니다.비동기 작업을 루프에서 실행할 수 있습니까? (iOS에서)
상태 속성이 해제 된 경우 루프를 중단하고 나머지 메서드를 계속 진행하고 싶습니다. 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"]);
그리고 여기 내 중포 기지 코드는 다음과 같습니다 : 여기에 루프입니다
-(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 = @ "free"; "self.freedom = @"matched ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;& –
왜 상태가 변하는 지 관찰자를 추가하지 마십시오 : FEventTypeChildChanged. 그런 다음 사용자 상태를 확인하고 무료 상태 인 사용자를 무료 사용자 배열에 추가 할 수 있습니다. –
현재 시점에서 값을 원하기 때문에 현재 사용자가 다른 무료 사용자와 즉시 일치 할 수 있으므로이 작업을 수행하지 않을 것입니다. 를 조회하는 사용자의 유형은 최대 사용자의 현재 설정에 따라 변경도 (부싯깃처럼) 그래서 이것은 내가 생각하는 모든 사용자를 찾고 필요하다? 또한 나는 아직도 내가 다시 – ryder