获取线上版本号是一件很耗时的操作,所以开辟一个子线程,代码如下
//检测新版本
//说明:开辟子线程运行耗时代码块,然后在主线程中刷新和显示
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;
};