2014-07-17 94 views
0

我有以下的方法來檢查電子郵件在我的數據庫已經存在:問題與BOOL方法

-(BOOL) emailHasBeenTaken:(NSString *)email 
{ 



     PFQuery *query = [PFUser query]; 
     [query whereKey:@"email" equalTo:email]; 

     [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
      if (!error && objects.count>0) { 
       NSLog(@"in the emailHasbeenTaken EMAIL IS DUPLICATE"); 
       [self duplicateEmail]; 

      } else 
      { 
       NSLog(@"in the emailHasBeenTaken, EMAIL IS NOT EXISTENT"); 
      } 
     }]; 

    return YES; 

} 

是我遇到的問題是,有時它會不會工作,有時,我不是知道我做錯了,我的意思是通過工作或沒有爲這個...我檢查時,一個新的用戶嘗試用下面的代碼註冊:

 if (![self emailHasBeenTaken:self.emailTF.text]) { 
    // EMAIL WAS NOT FOUND IN DATABASE SO IT WILL ASSIGN THE 
     TEXTFIELD VALUES TO USER PROPERTIES  

    email = self.emailTF.text; 
        user.email = email; 
       } else 
       { 
        [self duplicateEmail]; 
        return; 
       } 

我在做什麼錯?爲什麼我發現自己將!添加到我的if語句中以獲得期望的結果..是否有方法從BOOL語句接收多個返回值?即一個情況會返回YES,另一個會返回NO。

+0

@馬特,我想,但我不斷收到的只是顯示一個構建失敗的錯誤 – iBull

回答

4

首先,你正在對Parse進行異步調用,它什麼都不做(除了調用duplicateEmail方法,你沒有發佈,所以我不知道它做了什麼),然後你總是返回YESemailHasBeenTaken:方法。

由於您需要進行異步調用才能獲取所有收到該電子郵件的用戶,因此您需要重新格式化方法的工作方式。你要改變它的東西是這樣的:

- (void)emailHasBeenTaken:(NSString *)email completion:(void(^)(BOOL emailIsTaken, NSError *error))completionBlock 
{ 
    void (^completionCopy)(BOOL, NSError *) = [completionBlock copy]; 

    PFQuery *query = [PFUser query]; 
    [query whereKey:@"email" equalTo:email]; 

    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 

     if (error) { 
      NSLog(@"in the emailHasbeenTaken ERROR HAS OCCURRED"); 
      if (completionCopy) { 
       completionCopy(NO, error); 
      } 
      return; 
     } 

     if (objects.count > 0) { 
      NSLog(@"in the emailHasbeenTaken EMAIL IS DUPLICATE"); 
      if (completionCopy) { 
       completionCopy(YES, nil); 
      } 
     } 
     else { 
      NSLog(@"in the emailHasBeenTaken, EMAIL IS NOT EXISTENT"); 
      if (completionCopy) { 
       completionCopy(NO, nil); 
      } 
     } 
    }]; 
} 

注意,此方法是目前異步本身,因此使用它作爲一個條件在if說法是不可能的。你會用它代替這樣的:

NSString *emailFromTextField = self.emailTF.text; 

[self emailHasBeenTaken:emailFromTextField completion:^(BOOL emailIsTaken, NSError *error) { 
    if (error) { 
     // TODO: handle any errors here 
     return; 
    } 

    if (!emailIsTaken) { 
     // Assuming "email" and "user" are instance variables here: 
     email = emailFromTextField; 
     user.email = email; 
    } 
    else { 
     [self duplicateEmail]; 
    } 
}]; 
+0

可以請你更詳細一點,我所有的'duplicateEmail'方法是做解釋在我看來的一個警報 – iBull

+1

當然,我會更新我的答案,而我認爲你應該做的。 – TylerTheCompiler

+0

謝謝@DrBeardface – iBull