2015-08-29 2 views
-2

Я делаю приложение для социальных сетей и одну из функций на экране регистрации, он проверяет, берется ли имя пользователя в реальном времени и помещает X или проверяет, было ли это принято (снова в в реальном времени). Я использую таймер для этого, но по какой-то причине таймер останавливается через несколько секунд. Что происходит? И есть ли лучший способ сделать это?NSTimer останавливается через несколько секунд

override func viewDidLoad() { 
    username.delegate = self 
    email.delegate = self 
    password.delegate = self 
    var timer = NSTimer() 
    timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("checkOrX"), userInfo: nil, repeats: true) 
} 

func checkOrX() { 
    var query = PFQuery(className: "_User") 
    query.whereKey("username", equalTo: self.username.text) 
    query.findObjectsInBackgroundWithBlock { (users, error) -> Void in 
     if let users = users { 
      self.usernameCheck.image = UIImage(named: "X.png") 
     } else { 
      self.usernameCheck.image = UIImage(named: "Check.png") 
     } 
    } 
} 
+0

woah, я сомневаюсь, что разбор оценят этот запрос спама. Каким образом таймер «останавливается» ??? Вы добавили заявление о регистрации? – luk2302

+0

Что значит заявление о регистрации? –

+1

Заявление о регистрации: 'print (" in checkOrX ")' в методе. Потратьте некоторое время на чтение отладки, вы будете делать много, мы все это делаем. – zaph

ответ

5

Вместо отправки 100 запросов в секунду, что плохо по многим причинам, вы должны послать запрос на самое каждый раз, когда пользователь изменяет фактическое имя пользователя.

Почему ваше текущее решение плохо:

  • Вы отправляете слишком много запросов - период
  • Вы отправить же запрос самый раз снова и снова
  • Вы можете получить бан от синтаксического анализа для spamming this much
  • Вы вызываете слишком большой сетевой трафик, предположите, что кто-то в мобильном Интернете заполняет форму входа в течение 5-10 секунд, отвлекается и открывая приложение в течение 1 минуты или около того, я лично не будет рад потерять несколько мегабайт только для этого.

Что вы можете сделать:

  • отправить запрос после каждого изменения пользователь делает на его имя пользователя (используйте this question & answer и объединить его с checkOrX)
  • как только вы отправить новый запрос , отменить ранее отправленные запросы, которые еще не закончили ваш текущий
  • ждать крошечных пауз пользователя - если он не набирает новый символ в течение 0,1 секунды и только затем запрашивает сервер
  • только отправить th запрос е, если пользователь пытается отправить форму
  • только отправить запрос, если пользователь фокусирует другой элемент формы
  • т.д.

Пример версия первого «решения», вероятно, выглядеть

func viewDidLoad() { 
    // ... 
    self.username.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged) 
} 

func textFieldDidChange(textField: UITextField) { 
    if textField == self.username { 
     checkOrX() 
    } 
} 
+0

Как отправить запрос каждый раз при изменении имени пользователя? –

+0

@ EthanCotler Я добавил немного подробней к этому конкретному случаю – luk2302

Смежные вопросы