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
- iOS 多线程在项目中的应用场景(一)
- ios-多线程技术在开发中的应用场景
- java线程在项目中的应用场景
- MD5在IOS中的应用场景
- Spring在项目中的应用(一)
- 瓦片地图在iOS项目中的应用
- MVC模式在j2me项目中的应用(一)
- MVC模式在j2me项目中的应用(一)
- iOS中的多线程一般使用场景
- ios开发--RunLoop的应用场景(一)
- iOS开发多线程在实际项目中的运用
- iOS开发多线程在实际项目中的运用
- 声波通信(声波传输)在iOS、Android中的应用场景深入分析(含部分声波通信源代码)
- 声波通信(声波传输)在iOS、Android中的应用场景深入分析(含部分声波通信源代码)
- REDIS 在电商中的实际应用场景(转)
- ode在大型mmo场景中的应用
- ode在大型mmo场景中的应用
- Callback机制在Android中的应用场景
- bzoj3357[Usaco2004]等差数列 DP
- 这几天看的一篇文章很有感触的文章
- 【转】漫谈Moq(一)
- 关于函数的重载、覆盖和重写(Overload、Overwrite、Override)
- 帧同步相关笔记
- iOS 多线程在项目中的应用场景(一)
- leetcode 378. Kth Smallest Element in a Sorted Matrix
- 解决 element ui 弹出组件的遮罩层在弹出层的上面的问题
- POSIX信号处理
- 素数环
- dojo.declare/dojo.provide/dojo.require:JavaScript模块化管理工具
- 477. Total Hamming Distance
- AYIT2017暑假集训第二周周三赛 C
- hive的查询注意事项以及优化总结