在Tab栏中实现iOS徽章通知的最佳方式

时间:2015-10-14 23:06:24

标签: ios swift parse-platform architecture badge

一般来说,我想在过去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. 

给出以下参数:

  1. 如果用户在Tab1上FeedItems,查询运行并填充徽章,我希望徽章显示,然后当用户通过UIRefreshControl()

    重新加载Feed时消失
  2. 如果用户在Tab2或其他视图上,我希望徽章显示,只有当用户按下Tab1时才会消失。

  3. 我希望查询每10分钟运行一次新项目的数量。

  4. 我尝试在viewWillAppear和viewDidAppear()中运行getRecentFeedItems()。

    有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

据我所知,您需要更改的唯一事情是在后台运行getRecentFeedItems,并且只有在您从查询中获得成功或失败消息后才更新徽章值。这将防止在主线程上发生操作的警告。

希望这有帮助!