• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 使用 NSTimer 调用函数

[复制链接]
菜鸟教程小白 发表于 2022-12-11 17:02:36 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

如下所示,函数 loadView 3 应该在用户点击按钮后运行 300 秒(5 分钟)。但是当我构建和运行时,它没有。我也做了一些实验,我把定时器改成了 5 秒,它奏效了。那么在应用程序从 iOS 系统中挂起后,NSTimer 就不再运行了吗?那么问题出在哪里,我该如何解决呢?

@IBAction func buttonTapped(sender: AnyObject) {
    NSTimer.scheduledTimerWithTimeInterval(300, target: self, selector: #selector(ViewController.loadView3), userInfo: nil, repeats: false)    
    createLocalNotification()
}

func createLocalNotification() {
    let localnotification = UILocalNotification()
    localnotification.fireDate = NSDate(timeIntervalSinceNow: 300)
    localnotification.applicationIconBadgeNumber = 1
    localnotification.soundName = UILocalNotificationDefaultSoundName
    localnotification.alertBody = "Hello!"
    UIApplication.sharedApplication().scheduleLocalNotification(localnotification)
}

func loadView3() {
    label.text = "e89saa"
}



Best Answer-推荐答案


你可以试试这样的。方法是,如果定时器工作以相同的逻辑进行,否则(可能应用程序被杀死或进入后台),在方法 viewWillAppear 中显示 Controller 之前保存firedDate并更新UI。

@IBAction func buttonTapped(sender: AnyObject) {
    NSTimer.scheduledTimerWithTimeInterval(300, target: self, selector: #selector(ViewController.loadView3), userInfo: nil, repeats: false)    
    createLocalNotification()
}

func createLocalNotification() {
    let localnotification = UILocalNotification()
    localnotification.fireDate = NSDate(timeIntervalSinceNow: 300)
    localnotification.applicationIconBadgeNumber = 1
    localnotification.soundName = UILocalNotificationDefaultSoundName
    localnotification.alertBody = "Hello!"
    UIApplication.sharedApplication().scheduleLocalNotification(localnotification)

    // save in UserDefaults fireDate
    let defaults = NSUserDefaults.standardUserDefaults()
    defaults.setObject(localnotification.fireDate, forKey: "firedDate")
    defaults.synchronize()
}

func loadView3() {
    // reset in UserDefaults fireDate
    let defaults = NSUserDefaults.standardUserDefaults()
    defaults.removeObjectForKey("firedDate")
    defaults.synchronize()

    label.text = "e89saa"
}

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated) // No need for semicolon

    // retrieve fireDate from UserDefaults
    let defaults = NSUserDefaults.standardUserDefaults()
    let fireDate = defaults.objectForKey("firedData")

    // check if we should update UI
    if let _ = fireDate as? NSDate! {
        if currentDate.compare(firedDate) == NSComparisonResult.OrderedDescending {
            loadView3()
        }
    }
}

关于ios - 使用 NSTimer 调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38493304/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap