2016-01-20 2 views
0

Я смотрю документацию по Parse, и есть интересная функция, которую я хотел бы использовать, чтобы сделать валидацию для регистрации пользователей, если зарегистрировано (принято) имя пользователя и адрес электронной почты. Документация содержит пример для следующих целей:Swift Parse - используя функцию PFQuery илиQueryWithSubqueries

var lotsOfWins = PFQuery(className:"Player") 
lotsOfWins.whereKey("wins", greaterThan:150) 

var fewWins = PFQuery(className:"Player") 
fewWins.whereKey("wins", lessThan:5) 

var query = PFQuery.orQueryWithSubqueries([lotsOfWins, fewWins]) 
query.findObjectsInBackgroundWithBlock { 
    (results: [PFObject]?, error: NSError?) -> Void in 
    if error == nil { 
    // results contains players with lots of wins or only a few wins. 
    } 
} 

моя версия этого является:

/*Check username and email not taken*/ 
     let usernameInputCheck = PFQuery(className:"_User") 
     usernameInputCheck.whereKey("appUsername", equalTo: self.usernameTxtField.text!) 

     let emailInputCheck = PFQuery(className:"_User") 
     emailInputCheck.whereKey("email", equalTo:self.emailTxtField.text!) 

     let query = PFQuery.orQueryWithSubqueries([usernameInputCheck, emailInputCheck]) 
     query.findObjectsInBackgroundWithBlock { 
      (results: [PFObject]?, error: NSError?) -> Void in 
      if error == nil { 
       // results contains players with lots of wins or only a few wins. 
      } 
     } 

Я хочу, чтобы иметь возможность проверить, если адрес электронной почты или имя пользователя принимается, и если да, установить флаг так, чтобы Я могу задать сообщение пользователю, например: «Электронная почта уже зарегистрирована» или «Имя пользователя недоступно, попробуйте другое».

Спасибо за вашу помощь заранее.

Update: Вот ссылка на Разобрать документы: https://parse.com/docs/ios/guide#queries-compound-queries

ответ

2

Вот некоторые Objective-C, что делает трюк, который вы могли бы легко адаптироваться к Swift.

PFQuery * nameQuery = [PFQuery queryWithClassName:@"user"] 
[nameQuery whereKey:"username" equalTo:username]; 
PFQuery * emailQuery = [PFQuery queryWithClassName:@"user"]; 
[emailQuery whereKey:"email" equalTo:email]; 


PFQuery * query = [PFQuery orQueryWithSubqueries:@[nameQuery, emailQuery] 

     [query countObjectsInBackgroundWithBlock:^(int number, NSError *error) { 
      if(number > 0) { 
      //Email address OR username is already in use. 
     } 
     }]; 
+0

Да, что бы проверить, отправлено ли электронное письмо или нет , но то, что я просил, проверяет, принимаются ли как электронная почта, так и имя пользователя (или либо). Учитывая, что мой столбец имени пользователя является обычным (не используемое по умолчанию имя пользователя, обработанное Parse), этот подход приведет к двум запросам, чтобы проверить имя пользователя и адрес электронной почты отдельно. –

+0

Проверьте редактирование, которое я только что сделал. Вы можете просто добавить несколько запросов whereKey/equalTo к запросу. – StevenOjo

+0

Да, действительно, вы можете, но потом, как вы узнаете, какое сообщение представляет пользователю (имя пользователя принято или отправлено по электронной почте)? Я уже решил это, используя вышеприведенный код, который я изначально разместил, и имел функцию, возвращающую int и основанную на значении, я знаю, что это имя пользователя или адрес электронной почты. Затем я устанавливаю сообщение и показываю пользователю. Я очень благодарен за то, что вы пытаетесь помочь хотя :) –

0

Обход проблемы:

пусть usernameInputCheck = PFQuery (имя класса: "_ Пользователь") usernameInputCheck.whereKey ("appUsername", equalTo: self.usernameTxtField.text)

let emailInputCheck = PFQuery(className:"_User") 
    emailInputCheck.whereKey("email", equalTo:self.emailTxtField.text!) 

    let query = PFQuery.orQueryWithSubqueries([usernameInputCheck, emailInputCheck]) 
    query.findObjectsInBackgroundWithBlock { 
     (results: [PFObject]?, error: NSError?) -> Void in 
     if error == nil { 
      let checkResult = self.emailOrUsernameIsTaken(results!) 
      if(checkResult != 0 && checkResult == 1) 
      { 
       //username taken 
      }else if (checkResult != 0 && checkResult == 2){ 
       //email taken 
      } 
     } 
    } 

и вот эта функция:

func emailOrUsernameIsTaken(results: [PFObject])->Int 
    { 
     /*Check if username is taken or if email is taken*/ 

     var preferenceTaken: Int = 0 

     if(results[0]["email"] as! String != "" && results[0]["email"] as! String == self.userObject.email!) 
     { 
      preferenceTaken = 1 
     }else if(results[0]["appUsername"] as! String != "" && results[0]["appUsername"] as! String == self.userObject.username!){ 
      preferenceTaken = 2 
     } 

     return preferenceTaken 
    } 
Смежные вопросы