NSTimer 几秒钟后停止

Posted

技术标签:

【中文标题】NSTimer 几秒钟后停止【英文标题】:NSTimer stops after a few seconds 【发布时间】:2015-08-29 16:53:31 【问题描述】:

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

【问题讨论】:

哇,我怀疑 parse 会欣赏该请求垃圾邮件。计时器以什么方式“停止”???您是否添加了日志记录语句? 日志语句是什么意思? 记录语句:print("in checkOrX") 在方法中。花一些时间阅读有关调试的信息,您会做很多事情,我们都会这样做。 你不只是认真地问我记录日志的意思 :O :'((( 仅检查文本字段的内容是否更改(为此目的有通知)可能比每秒检查 100 次更有效。 【参考方案1】:

与其每秒发送 100 个请求(由于多种原因是不好的),不如每次用户更改实际用户名时最多发送一个请求。

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

您发送的请求过多 - 句号 您一遍又一遍地发送相同的请求 您可能会因为发送这么多垃圾邮件而被禁止解析 你造成了太多的网络流量,假设有人在移动互联网上填写登录表单 5-10 秒,分心并让应用程序打开 1 分钟左右,我个人不乐意失去一个仅此而已。

你能做什么:

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

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

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


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

【讨论】:

每次更改用户名时如何发送请求? @EthanCotler 我为那个特殊案例添加了更多细节

以上是关于NSTimer 几秒钟后停止的主要内容,如果未能解决你的问题,请参考以下文章

如何用另一个 NSTimer 停止 NSTimer?

使用 NSTimer 更好地验证信标

如果某个动作正在运行,如何设置 NSTimer 停止?

如何停止 NSTimer

iOS 中的 NSTimer

NStimer 被堵塞