一般来说,我想在过去10分钟内查询我的数据库中的所有新FeedItem。这个Feed应该每10分钟就有一批很好的新FeedItem。
我写了一个函数:
func getRecentFeedItems() {
// Set up timing
let date = NSDate()
let calendar = NSCalendar.autoupdatingCurrentCalendar()
let dateMinusTenMin = calendar.dateByAddingUnit(.Minute, value: -10, toDate: date, options: [])
//Query the DB
let getRecentFeedItems = FeedItem.query()
getRecentFeedItems!.whereKey("createdAt", greaterThan: dateMinusTenMin!)
let newBadgeCount: Int = (getRecentFeedItems?.countObjects())!
if newBadgeCount > 0 {
self.navigationController?.tabBarItem.badgeValue = String(newBadgeCount) //update the Badge with the new count
print("update the badge with \(newBadgeCount)")
} else {
self.navigationController?.tabBarItem.badgeValue = nil
}
}
此功能可以更新徽章通知,但是当我设置一个计时器让它每十分钟运行一次时:
var updateBadgeQueryTimer = NSTimer.scheduledTimerWithTimeInterval(600.0, target: self, selector: Selector("updateBadgeQuery"), userInfo: nil, repeats: true)
它确实有效,但我得到以下警告,我知道这是一个严肃的警告:
Warning: A long-running operation is being executed on the main thread.
给出以下参数:
如果用户在Tab1上FeedItems,查询运行并填充徽章,我希望徽章显示,然后当用户通过UIRefreshControl()
如果用户在Tab2或其他视图上,我希望徽章显示,只有当用户按下Tab1时才会消失。
我希望查询每10分钟运行一次新项目的数量。
我尝试在viewWillAppear和viewDidAppear()中运行getRecentFeedItems()。
有更好的方法吗?
答案 0 :(得分:0)
据我所知,您需要更改的唯一事情是在后台运行getRecentFeedItems
,并且只有在您从查询中获得成功或失败消息后才更新徽章值。这将防止在主线程上发生操作的警告。
希望这有帮助!