上一节完成了提醒数字的功能,但是还存在问题,就是当我们下拉或上拉首页内容时,底下的提醒数字不会改变,因为图片轮播器,主线程忙着处理滚动,没有时间算计时器的时间,所以,不会请求获取提醒数字的接口,导致这样的问题出现。

看图:从打印的记录可以看出,定时器每隔两秒会调用未读消息数的方法,但是当我们滚动下拉UIView时,定时器就会停止打印,定时器的线程在主线程,我们应该放在子线程让处理。
clipboard.png

一.将主线程添加到子线程

  // 定时检查未读数
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(checkUnreadCount) userInfo:nil repeats:YES];
    
    // 将定时器改为子线程
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

二、提醒数字在App图标右上角显示

clipboard.png

这里该如何做呢?
计算出所有未读消息数,然后只需要这样的一个方法即可解决:

   // 4.设置图标右上角的数字
        [UIApplication sharedApplication].applicationIconBadgeNumber = result.count;

applicationIconBadgeNumber

三、程序进入后台休眠的处理

现在,当程序进入后台,就会默认处于休眠状态,定时器即不会发送请求获取未读数,如果我们不需要程序休眠,继续运行,该怎么处理呢?

这里就需要应用到前边学习的应用程序的代理方法了
IWAppDelegate.m

//  IWAppDelegate.m
//  ItcastWeibo
/**
 * 让程序保持后台运行
 * 1.尽量申请后台运行的时间
 [application beginBackgroundTaskWithExpirationHandler:^{}
 
 * 2.在Info.plist中声明自己的应用类型
 *
 */

/**
 * App进入后台会调用这个方法
 */
- (void)applicationDidEnterBackground:(UIApplication *)application
{
   // 在后台开启任务让程序持续保持运行状态(能保持运行的时间是不确定)
    [application beginBackgroundTaskWithExpirationHandler:^{
        // IWLog(@"哈哈,后台继续运行---");
    }];
    
     // 本地通知(定时提醒弹框)
    // [UILocalNotification ];
}

Corwien
6.3k 声望1.6k 粉丝

为者常成,行者常至。