2014-09-12 3 views
0

그래서 내가 중포 기지를 사용하여 새로 온 이메일/암호 및 iOS 앱 개발과 중포 기지 간단한 로그인을 사용하여 실행 가져올 수 없습니다 일부를 들어이 guide.이 완료 블록

다음과 같은 간단한 로그인을 설정하려고 이유는 완료 블록 코드가 실행되지 않고 사용자 생성이 제대로되었는지 확인하기 위해 사용하는 bool은 항상 NO입니다. 디버거를 사용하여 코드를 단계별로 실행하려고 시도했으며 완료 블록에 도달했을 때 기본적으로 메소드의 끝 부분으로 뛰어 올랐습니다. 매우 이상한 동작이었습니다. 여기 내 코드 :

BOOL goodFirebaseCall = false; 

- (void)createUser:(NSString*)userName andPasswordis:(NSString*)password { 

    goodFirebaseCall = [self createFirebaseUser:userName andPasswordis:password]; 

    if(goodFirebaseCall==true) //goodFirebaseCall is always NO 
    { 
     NSLog(@"Logged in, now adding the user to Firebase."); 
     // Create a reference to a Firebase location 
     Firebase* fUsers = [[Firebase alloc] initWithUrl:@"https://xxxx.firebaseio.com/users"]; 

     Firebase* fNewUser = [fUsers childByAppendingPath:userName]; //childByAutoId]; 
     [fNewUser setValue:@{@"name":userName}]; 
    } 
    else 
    { 
     NSLog(@"Error, something went wrong with user creation"); 
    } 
} 

-(BOOL)createFirebaseUser:(NSString*)email andPasswordis:(NSString*)password 
{ 
    goodFirebaseCall = false; 
    Firebase* myRef = [[Firebase alloc] initWithUrl:@"https://xxxx.firebaseio.com/"]; 
    FirebaseSimpleLogin* authClient = [[FirebaseSimpleLogin alloc] initWithRef:myRef]; 
    [authClient createUserWithEmail:@"[email protected]" password:@"very secret" 
      andCompletionBlock:^(NSError* error, FAUser* user) { 
       if (error != nil) { 
        // There was an error creating the account 
        NSLog(@"%@", error); 
       } else { 
        // We created a new user account 
        goodFirebaseCall = true; 
        NSLog(@"User Created!"); 
       } 
      }]; 
    return goodFirebaseCall; 
} 

이 문제에 대한 도움을 주시면 감사하겠습니다! 나는 왜 완성 블록이 호출되지 않을지에 관해서 머리를 긁어왔다.

감사합니다, NuttGuy

+0

나는 iOS 전문가가 아니기 때문에 나를 괴롭히지 만 goodFirebaseCall이 설정되기 전에 createUserWithEmail 메소드가 완료되기를 기다릴 필요가 없다. 즉, 완료 블록은'return goodFireabaseCall' 전에 실행되지 않으므로 true로 설정되지 않습니다. – Kato

+0

@Kato Firebase가 createUserWithEmail 메소드와 같은 동작을 대기열에 넣는 방법에 대해 읽은 후에 비슷한 생각을했습니다. 그렇다면 목표 C에 대한 지식이 부족하여 createUserWithEmail 메서드가 완료 될 때까지 기다려야 goodFirebaseCall이 실제로 설정됩니다. – NuttGuy

답변

3

그것은 당신이 기적 createUserWithEmail:password을 사용하려는처럼 보이지만 완료 블록은 실제로 비동기 적으로 실행됩니다. 그러면 Firebase가 백그라운드에서 작동하고 UI가 정지하지 않습니다. 즉, 실행하려는 코드가 인 후 createUser 호출은 완료 블록 안에이어야합니다. 완료 블록을 사용하여 원하는 추가 사용자 작성을 완료하는 다른 메소드를 호출 할 수도 있습니다.

이 같은 코드를 구성 할 수 있습니다

- (void)createUser:(NSString *)userName 
     withEmail:(NSString *)email 
     andPassword:(NSString *)password { 

    [self createFirebaseUser:userName withEmail:email andPassword:password]; 
} 


- (void)createFirebaseUser:userName 
       withEmail:(NSString *)email 
       andPassword:(NSString *)password { 

    Firebase* myRef = [[Firebase alloc] initWithUrl:@"https://xxxx.firebaseio.com/"]; 
    FirebaseSimpleLogin* authClient = [[FirebaseSimpleLogin alloc] initWithRef:myRef]; 
    [authClient createUserWithEmail:email password:password 
     andCompletionBlock:^(NSError* error, FAUser* user) { 
      if (error != nil) { 
       // There was an error creating the account 
       NSLog(@"%@", error); 
       [self completeCreateUser:userName 
         withFirebaseUser:user ifFirebaseSucceeds:NO]; 
      } else { 
       NSLog(@"User Created! %@", user); 
       [self completeCreateUser:userName 
         withFirebaseUser:user ifFirebaseSucceeds:YES]; 
      } 
    }]; 
} 

- (void)completeCreateUser:(NSString *)userName 
      withFirebaseUser:(FAUser *)user 
     ifFirebaseSucceeds:(BOOL)goodFirebaseCall { 
    if (goodFirebaseCall) { 
     NSLog(@"User created, but not logged in, now adding the user to Firebase."); 
     // Create a reference to a Firebase location 
     Firebase* fUsers = [[Firebase alloc] initWithUrl:@"https://xxxx.firebaseio.com/users"]; 

     Firebase* fNewUser = [fUsers childByAppendingPath:user.uid]; //childByAutoId]; 
     [fNewUser setValue:@{@"name":userName}]; 
    } else { 
     NSLog(@"Error, something went wrong with user creation"); 
    } 
} 

을 그래서 당신이 동일하다고 볼 경우 문 goodFirebaseCall, 대신의 주변 BOOL가 반환 될 수 있도록, 당신이 완료에서 다른 방법을 통화 대기 차단하고 "반환 된"BOOL을 전달하십시오.

세그먼트를 이동 한 위치를 볼 수 있도록 코드를 동일하게 유지하려고했지만 원하는 경우 완료 블록의 세 번째 방법에 모든 코드를 넣을 수있었습니다. 내가 수정 한 한 가지는 Firebase 사용자 참조에 추가 된 경로로 user.uid을 사용하는 것이 었습니다.이 경로는 보안 규칙과 로그인 할 때 사용하는 FAUser 개체에 항상 액세스 할 수 있기 때문에 사용했습니다.

또한 createUserWithEmail:password이 아니며 사용자가 로그인하십시오. loginWithEmail:andPassword:withCompletionBlock:createUserWithEmail:password 완성 블록이나 세 번째 방법으로 다시 호출해야합니다.

+0

좋아요. 위에서 설명한대로 코드를 시도했지만 Firebase Simple Login 호출이 비동기 호출이라는 것을 이해하지 못했습니다. 그래서 완성 블록이 실행되지 않은 이유를 이해할 수 있습니다. 이것은 Obj C 지식이 부족한 문제 일지 모르지만 위 코드의 문제가 발생했습니다. 기본적으로 'createFirebaseUser'메서드의 완료 블록에 도달하고 메서드의 끝으로 점프하고 돌아갑니다 iOS 시뮬레이터에 있지만 UI는 완전히 반응하지 않습니다. 알림 센터를 계속 열어도되지만 앱의 UI와 전혀 상호 작용할 수 없습니다. – NuttGuy

+0

내가 가진 또 다른 질문은 완성 블록이 언제 호출되는 것인가? 'createUserWithEmail : password'를 호출 한 후 어느 시점에서? – NuttGuy

+0

죄송합니다. 내 문제를 발견했습니다. 어리석은 사본 파스타와 나는 나의 firebase URL 안에 xxxx 안에, 너의 응답을 위해 순전히 고맙게 여기었다! – NuttGuy