NSTimer 几秒后停止

NSTimer stops after a few seconds

我正在制作一个社交媒体应用程序,注册屏幕中的一个功能是检查用户名是否被实时使用并打 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")
        }
    }
}

不要每秒发送 100 个请求,这出于多种原因是不好的,每次用户更改实际用户名时,您最多应该发送一个请求。

为什么您当前的解决方案不好:

  • 您发送的请求过多 - 期间
  • 您多次发送相同请求
  • 你可能会因为发送这么多垃圾邮件而被禁止解析
  • 你造成了太多的网络流量,假设某人在移动互联网上填写登录表单 5-10 秒,分心并打开应用程序 1 分钟左右,我个人不会乐意仅为此松动几兆字节。

你可以做什么:

  • 在用户对其用户名进行每次更改后发送请求(使用 并将其与您的 checkOrX 结合使用)
  • 发送新请求后,立即取消之前发送但未完成当前请求的请求
  • 等待用户的微小停顿 - 如果他在 0.1 秒内没有输入新字符然后才查询服务器
  • 仅在用户尝试提交表单时才发送请求
  • 仅当用户关注另一个表单元素时才发送请求
  • 等等

第一个 "solution" 的示例版本可能看起来像

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

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