2016-08-29 1 views
0

사용자 우편 번호를 Firebase 데이터베이스에 저장하고 앱 실행시 해당 데이터베이스를 쿼리하여 사용자가 이미 우편 번호를 입력했는지 또는 새로운 사용자인지 확인하려고합니다.Obj-C를 사용하여 Firebase에서 데이터 포인트를 가져 오는 방법은 무엇입니까?

전에 코드를 게시했습니다. 나는 중포 기지의 문서에서 샘플 코드를 뽑아하지만, 내가 밖으로 놓치고 무엇 내 애플 결코 심지어 값을

[[[_ref child:@"user"] child:userID] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {... 

를 얻기 위해 다음 코드를 실행하지 않습니다 보인다?

#import "FollowingVC.h" 
#import <FirebaseDatabase/FirebaseDatabase.h> 
@import Firebase; 

@interface FollowingVC() 

@property NSString *uid; 
@property FIRDatabaseReference *ref; 
@property NSString *zipcode; 

@end 

@implementation FollowingVC 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self createAuthorizedUser]; 
    [self checkForZipCode]; 
} 

-(void)createAuthorizedUser 
{ 
    [[FIRAuth auth] 
    signInAnonymouslyWithCompletion:^(FIRUser *_Nullable user, NSError *_Nullable error) { 
     if (!error) { 
      self.uid = user.uid; 

      self.ref=[[FIRDatabase database]reference]; 
      } 
    }]; 
} 

-(void)checkForZipCode 
{ 
    NSString *userID = [FIRAuth auth].currentUser.uid; 
    [[[_ref child:@"user"] child:userID] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) { 
     // Get user value 
     self.zipcode = snapshot.value[@"zip code"]; 

     NSLog(@"It worked: %@", self.zipcode); 

     // ... 
    } withCancelBlock:^(NSError * _Nonnull error) { 
     NSLog(@"%@", error.localizedDescription); 
    }]; 

} 

@end 

답변

1

Firebase는 비동기식이며 이벤트가 완료 될 때까지 기다려야 응용 프로그램에서 계속 진행됩니다.

이 경우 self.uid가 채워진 후 로그인 블록 내에서 [self checkForZipCode]를 호출해야합니다.

그렇지 않으면 self.uid가 채워지기 전에 checkForZipCode 함수가 실행될 위험이 있습니다.

Firebase가 응용 프로그램의 흐름을 제어하게하고 인터넷 지연 등으로 인해 문제가 생길 수 있으므로 Firebase를 동 기적으로 사용하지 마십시오.

관련 문제