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 几秒钟后停止的主要内容,如果未能解决你的问题,请参考以下文章