iOS 多线程在项目中的应用场景(一)

本文介绍了如何在iOS应用中检查远程版本号,并通过正确地使用子线程和主线程来确保UI元素如版本更新提示红点的及时显示。文章还深入探讨了子线程中UI更新的工作机制。

获取线上版本号是一件很耗时的操作,所以开辟一个子线程,代码如下


//检测新版本
    //说明:开辟子线程运行耗时代码块,然后在主线程中刷新和显示
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
    
            //检测新版本
            self.hasNewVersion = [self checkVersion];
            [self.tableView reloadData];
          
        });

此处加了一个 hasVersion 标识,它控制着版本升级提示的红点显示。中间遇到的一个问题就是红点该显示的没有显示出来,或是很久才显示出来,对tableView上的cell做点击操作,第一次点击不会响应,点击或者滑动tableView红点立刻就显示出来了,显然,红点显示没有放在主线程中进行,当滑动tableView时主线程刷新红点才出来,于是把上面代码中tableView的刷新加在了主线程

dispatch_async(dispatch_get_global_queue(0, 0), ^{
    
            //检测新版本
            self.hasNewVersion = [self checkVersion];
    
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.tableView reloadData];
            });
        
        });

这样红点提示就顺利显示出来了。原来之前的刷新房子啊了子线程中。注意到,放在子线程中刷新UI,为什么会出现红点有时会出现有时不会呢?

带着这个问题查阅了网上的资料,其中http://blog.sina.com.cn/s/blog_45e2b66c0102v254.html这篇文章给了我很大启发,子线程中对所有其他UI更新都要等到该子线程生命周期结束才进行,如果子线程一直在运行,则子线程中的UI更新的函数栈主线程无法获知,即无法更新。


//MARK:查看新版本
- (BOOL)checkVersion {
    BOOL hasNewVersion = NO;
    NSString *newVersion;
    NSURL *url = [NSURL URLWithString:@"http://itunes.apple.com/cn/lookup?id=xxxxxxx"];
    NSString *jsonResponseString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
    if (jsonResponseString != nil) {
        NSData *data = [jsonResponseString dataUsingEncoding:NSUTF8StringEncoding];
        //解析json数据
        id json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        NSArray *array = json[@"results"];
        
        for (NSDictionary *dic in array) {
            newVersion = [dic valueForKey:@"version"];
        }
        Log(@"通过appStore获取的版本号是:%@",newVersion);
        
        //获取本地软件的版本号
        NSString *localVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];  //CFBundleVersion--获取当前build版本   CFBundleShortVersionString--获取当前app版本
        
        [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"findNewVersion"];
        
        //对比发现的新版本和本地版本
        NSComparisonResult comparisonResult = [localVersion compare:newVersion options:NSNumericSearch];
        
        switch (comparisonResult) {
                
            case NSOrderedSame:
                Log(@"本地版本与线上版本相同不需要更新");
                hasNewVersion = NO;
                break;
                
            case NSOrderedAscending:
                Log(@"本地版本 < 线上版本,需要更新");
                [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"findNewVersion"];
                hasNewVersion = YES;
                break;
                
            case NSOrderedDescending:
                Log(@"本地版本 > 线上版本,不需要更新");
                hasNewVersion = NO;
                break;
                
            default:
                break;
        }
    }
    return hasNewVersion;
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值