调度 UILocalNotification 导致用户界面滞后和延迟
Scheduling UILocalNotification causing lagging and delay of user interface
我在 Swift 代码中有一个函数 scheduleFutureLocalNotifications()
,它创建了 64 个 UILocalNotification
在未来触发。
最初该函数是在 viewDidLoad()
调用的,但这会导致启动应用程序时出现延迟。
接下来,在活动应用程序期间调用了该函数,但这导致了不可预测的暂停或用户界面滞后。
最后,当应用在收到 UIApplicationDidEnterBackground
通知后转换到后台时触发该函数,但这会导致 iOS 短暂滞后,因为本地通知是在后台准备的.这在旧设备上显得更加明显。
问题:
1 - How can I reduce lag and improve user interface responsiveness
creating local notifications?
2 - What better techniques can be employed to schedule the 64
notifications?
3 - What other better times could the function scheduleFutureLocalNotifications()
be called?
代码:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
scheduleFutureLocalNotifications()
}
func scheduleFutureLocalNotifications() {
// Remove all previous local notifications
let application = UIApplication.sharedApplication()
application.cancelAllLocalNotifications()
// Set new local notifications to fire over the coming 64 days
for nextLocalNotification in 1...64 {
// Add calendar day
let addDayComponent = NSDateComponents()
addDayComponent.day = nextLocalNotification
let calendar = NSCalendar.currentCalendar()
let nextDate = calendar.dateByAddingComponents(addDayComponent, toDate: NSDate(), options: [])
// Set day components for next fire date
let nextLocalNotificationDate = NSCalendar.currentCalendar()
let components = nextLocalNotificationDate.components([.Year, .Month, .Day], fromDate: nextDate!)
let year = components.year
let month = components.month
let day = components.day
// Set notification fire date
let componentsFireDate = NSDateComponents()
componentsFireDate.year = year
componentsFireDate.month = month
componentsFireDate.day = day
componentsFireDate.hour = 0
componentsFireDate.minute = 0
componentsFireDate.second = 5
let fireDateLocalNotification = calendar.dateFromComponents(componentsFireDate)!
// Schedule local notification
let localNotification = UILocalNotification()
localNotification.fireDate = fireDateLocalNotification
localNotification.alertBody = ""
localNotification.alertAction = ""
localNotification.timeZone = NSTimeZone.defaultTimeZone()
localNotification.repeatInterval = NSCalendarUnit(rawValue: 0)
localNotification.applicationIconBadgeNumber = nextLocalNotification
application.scheduleLocalNotification(localNotification)
}
}
}
您可以将函数异步分派到另一个队列。这将确保主队列不会阻塞执行调度,并防止 UI 变得无响应:
override func viewDidLoad() {
super.viewDidLoad()
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
scheduleFutureLocalNotifications()
}
}
我在 Swift 代码中有一个函数 scheduleFutureLocalNotifications()
,它创建了 64 个 UILocalNotification
在未来触发。
最初该函数是在 viewDidLoad()
调用的,但这会导致启动应用程序时出现延迟。
接下来,在活动应用程序期间调用了该函数,但这导致了不可预测的暂停或用户界面滞后。
最后,当应用在收到 UIApplicationDidEnterBackground
通知后转换到后台时触发该函数,但这会导致 iOS 短暂滞后,因为本地通知是在后台准备的.这在旧设备上显得更加明显。
问题:
1 - How can I reduce lag and improve user interface responsiveness creating local notifications?
2 - What better techniques can be employed to schedule the 64 notifications?
3 - What other better times could the function
scheduleFutureLocalNotifications()
be called?
代码:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
scheduleFutureLocalNotifications()
}
func scheduleFutureLocalNotifications() {
// Remove all previous local notifications
let application = UIApplication.sharedApplication()
application.cancelAllLocalNotifications()
// Set new local notifications to fire over the coming 64 days
for nextLocalNotification in 1...64 {
// Add calendar day
let addDayComponent = NSDateComponents()
addDayComponent.day = nextLocalNotification
let calendar = NSCalendar.currentCalendar()
let nextDate = calendar.dateByAddingComponents(addDayComponent, toDate: NSDate(), options: [])
// Set day components for next fire date
let nextLocalNotificationDate = NSCalendar.currentCalendar()
let components = nextLocalNotificationDate.components([.Year, .Month, .Day], fromDate: nextDate!)
let year = components.year
let month = components.month
let day = components.day
// Set notification fire date
let componentsFireDate = NSDateComponents()
componentsFireDate.year = year
componentsFireDate.month = month
componentsFireDate.day = day
componentsFireDate.hour = 0
componentsFireDate.minute = 0
componentsFireDate.second = 5
let fireDateLocalNotification = calendar.dateFromComponents(componentsFireDate)!
// Schedule local notification
let localNotification = UILocalNotification()
localNotification.fireDate = fireDateLocalNotification
localNotification.alertBody = ""
localNotification.alertAction = ""
localNotification.timeZone = NSTimeZone.defaultTimeZone()
localNotification.repeatInterval = NSCalendarUnit(rawValue: 0)
localNotification.applicationIconBadgeNumber = nextLocalNotification
application.scheduleLocalNotification(localNotification)
}
}
}
您可以将函数异步分派到另一个队列。这将确保主队列不会阻塞执行调度,并防止 UI 变得无响应:
override func viewDidLoad() {
super.viewDidLoad()
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
scheduleFutureLocalNotifications()
}
}