【发布时间】:2018-12-10 09:10:18
【问题描述】:
即使在后台,我的 swift 应用程序也需要定期运行一段代码。实现这一目标的最佳方法是什么?
我试过DispatchQueue.global(qos: .background).async 但没用
新尝试:
我将此添加到我的 ViewController:
private var time: Date?
private lazy var dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .short
formatter.timeStyle = .long
return formatter
}()
func fetch(_ completion: () -> Void) {
time = Date()
completion()
}
这是我的 AppDelegate
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
// Override point for customization after application launch.
return true
}
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
if let tabBarController = window?.rootViewController as? UITabBarController,
let viewControllers = tabBarController.viewControllers
{
for viewController in viewControllers {
if let fetchViewController = viewController as? ViewController {
fetchViewController.fetch {
completionHandler(.newData)
print("fired")
}
}
}
}
}
并在completionHandler(.newData) 上放置一个断点。
但是当我运行应用程序时,断点永远不会被触发。并且打印语句从未执行。
【问题讨论】:
-
DispatchQueue是一个线程处理进程,当应用程序本身在后台时,它不是后台进程的实际实现。这是两个不同的东西。请先尝试理解这一点。在您的情况下,DispatchQueue.global(qos: .background).async将在应用程序处于前台时在后台线程中执行一些代码。请在 iOS 中寻找后台模式以满足您的要求。
标签: swift