2015-02-05 4 views
0

기본적으로 사용자의 '상태'속성을 쿼리하고 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); 
}]; 
} 

감사합니다!

+0

사이드 참고 : 열거 또는를 사용한다을 'self.freedom = @ "free"; "self.freedom = @"matched ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;& –

+0

왜 상태가 변하는 지 관찰자를 추가하지 마십시오 : FEventTypeChildChanged. 그런 다음 사용자 상태를 확인하고 무료 상태 인 사용자를 무료 사용자 배열에 추가 할 수 있습니다. –

+0

현재 시점에서 값을 원하기 때문에 현재 사용자가 다른 무료 사용자와 즉시 일치 할 수 있으므로이 작업을 수행하지 않을 것입니다. 를 조회하는 사용자의 유형은 최대 사용자의 현재 설정에 따라 변경도 (부싯깃처럼) 그래서 이것은 내가 생각하는 모든 사용자를 찾고 필요하다? 또한 나는 아직도 내가 다시 – ryder

답변

0

귀하의 질문에 대한 정확한 이해가 확실하지 않습니다. 몇 가지 조건이 다음 (제거 금지 - 동안) 할 수있다 (이 경우 [self.freedom isEqualToString:@"free"]에) 일치 될 때까지 당신은 다시 완료 코드를 실행하려면 :

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]; 
+0

감사는 응답을, 나는 최대한 빨리 이것을 시도 할 생각 무료 사용자 배열 내가 비동기 중포 기지 메소드를 호출 할 것이다 비어있는 경우의 문제로 실행됩니다. 이것이 왜 작동해야하며 왜 do/while 루프가 작동하지 않는지 궁금하십니까? 덕분에 내가 'checkIfFree'완료 블록의 마지막 줄에 오류 '나쁜 액세스'받고 있어요 – ryder

+0

'완료 (YES)' – ryder

+0

,이 작업 도움을 주셔서 감사있어! '잘못된 액세스'오류 해결 방법 참조 http://stackoverflow.com/questions/28388668/bad-access-after-block-within-a-block-is-called-ios – ryder

관련 문제