NSTimer在几秒钟后停止

Eth*_*ler -2 xcode nstimer ios parse-platform swift

我正在制作一个社交媒体应用程序,并且注册屏幕中的一个功能是检查用户名是否实时拍摄并放置X或检查是否已采用(再次实时).我使用计时器来完成此操作但由于某种原因,计时器在几秒钟后停止.这是怎么回事?有没有更好的方法来做这件事?

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")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

luk*_*302 5

每次用户更改实际用户名时,您应该最多发送一个请求,而不是每隔多次发送100个请求.

为什么你当前的解决方案很糟糕

  • 您发送了太多请求 - 期间
  • 您一次又一次地发送相同的请求
  • 你可能会被禁止解析垃圾邮件这么多
  • 你导致网络流量太大,假设有人在移动互联网上填写登录表单5-10秒,分心并让应用程序打开1分钟左右,我个人不乐意为此丢失几兆字节只有这样.

你能做什么:

  • 用户对用户名进行的每次更改后发送请求(使用此问题和答案并将其与checkOrX结合使用)
  • 一旦发送新请求,请取消之前发送的尚未完成当前请求的请求
  • 等待用户的微小暂停 - 如果他没有键入新字符0.1秒,然后只查询服务器
  • 仅在用户尝试提交表单时才发送请求
  • 仅在用户聚焦另一个表单元素时才发送请求
  • 等等

第一个"解决方案"的示例版本可能看起来像

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

func textFieldDidChange(textField: UITextField) {
    if textField == self.username {
        checkOrX()
    }
}
Run Code Online (Sandbox Code Playgroud)