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

来源:互联网 发布:在ubuntu上下载软件 编辑:程序博客网 时间:2024/05/21 19:19

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


//检测新版本    //说明:开辟子线程运行耗时代码块,然后在主线程中刷新和显示        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;};


阅读全文
0 0
原创粉丝点击