gpt4 book ai didi

ios - 调用 UIApplication 子类方法启动 scheduledTimer

转载 作者:行者123 更新时间:2023-11-28 23:21:43 35 4
gpt4 key购买 nike

我正在使用 Xcode 9.2/iOS 10 和 Swift 来检测 iOS 应用程序中的用户不活动,使用基于来自 https://blog.gaelfoppolo.com/detecting-user-inactivity-in-ios-application-684b0eeeef5b 的优秀教程示例的信息。我所做的改进是在调用 viewDidLoad 时启动计时器,并在 applicationDidTimeout 中添加贪睡功能。在编译时,会显示以下错误消息:“实例成员‘snoozeTimer’不能用于类型‘TimerApplication’;您是否打算改用此类型的值?”

applicationDidTimeout 将使用 snoozeTimer 来控制是否需要另一个定时器闹钟,具体取决于要添加到该方法的附加逻辑。

调用startTimer和snoozeTimer的正确方法是什么?

代码 list 如下:

主.swift

UIApplicationMain(
CommandLine.argc,
UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(
to: UnsafeMutablePointer<Int8>.self,
capacity: Int(CommandLine.argc)),
NSStringFromClass(TimerApplication.self),
NSStringFromClass(AppDelegate.self)
)

AppDelegate.swift

import UIKit

import Foundation

extension Notification.Name {

static let appTimeout = Notification.Name("appTimeout")

}

//@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?
var backgroundTaskRunCount : Int = 0


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.

NotificationCenter.default.addObserver(self,
selector: #selector(AppDelegate.applicationDidTimeout(notification:)),
name: .appTimeout,
object: nil
)


return true
}

. //other func
.
.

@objc func applicationDidTimeout(notification: NSNotification) {
backgroundTaskRunCount = backgroundTaskRunCount + 1

print("application did timeout, perform actions. Count=", backgroundTaskRunCount)

TimerApplication.snoozeTimer()
}
}

TimerApplication.swift

import UIKit

class TimerApplication: UIApplication {

private var wakeupInSeconds: TimeInterval {
// 2 minutes for for timer to fire first time
return 2 * 60
}

private let snoozeInSeconds: TimeInterval = 5

// the timeout in seconds, after which should perform custom actions
// such as disconnecting the user
private var timeoutInSeconds: TimeInterval = 120

private var idleTimer: Timer?

// resent the timer because there was user interaction
private func resetIdleTimer() {
if timeoutInSeconds > 0 {
if let idleTimer = idleTimer {
idleTimer.invalidate()
}

idleTimer = Timer.scheduledTimer(timeInterval: timeoutInSeconds,
target: self,
selector: #selector(TimerApplication.timeHasExceeded),
userInfo: nil,
repeats: false
)
} else {
stopTimer()
}
}

// if the timer reaches the limit as defined in timeoutInSeconds, post this notification
@objc private func timeHasExceeded() {
NotificationCenter.default.post(name: .appTimeout,
object: nil
)
}

override func sendEvent(_ event: UIEvent) {

super.sendEvent(event)

if idleTimer != nil {
self.resetIdleTimer()
}

if let touches = event.allTouches {
for touch in touches where touch.phase == UITouchPhase.began {
self.resetIdleTimer()
}
}
}

func startTimer() {
self.timeoutInSeconds = wakeupInSeconds
self.resetIdleTimer()
}

func stopTimer() {
if let idleTimer = idleTimer {
idleTimer.invalidate()
}
}

func snoozeTimer() {
self.timeoutInSeconds = snoozeInSeconds
}
}

ViewController.swift

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.

TimerApplication.startTimer()

}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}


}

最佳答案

您想使用 TimerApplication.shared.snoozeTimer() 而不是 TimerApplication.snoozeTimer() 因为 snoozeTimer() 是一个实例方法,不是类或静态方法。

您应该验证 TimerApplication.shared 返回您期望的 TimerApplication 实例,因为我从来没有像这样子类化系统单例。如果这不起作用,您将需要一种方法来获取对所需 TimerApplication 实例的引用。

关于ios - 调用 UIApplication 子类方法启动 scheduledTimer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59570246/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com