iOS 多執行緒在專案中的應用場景(一)
獲取線上版本號是一件很耗時的操作,所以開闢一個子執行緒,程式碼如下
//檢測新版本
//說明:開闢子執行緒執行耗時程式碼塊,然後在主執行緒中重新整理和顯示
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; };
相關推薦
Python多執行緒的理解和使用(一)Threading中join()函式的理解
1. 多執行緒的概念 多執行緒類似於同時執行多個不同程式,多執行緒執行有如下優點: 使用執行緒可以把佔據長時間的程式中的任務放到後臺去處理。 使用者介面可以更加吸引人,這樣比如使用者點選了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度 程式的執行速
多執行緒併發包學習總結(一)Lock鎖
為什麼需要Lock鎖 1.因為我們需要有一種機制可以不讓等待的執行緒一直無期限地等待下去(比如只等待一定的時間或者能夠響應中斷),通過Lock就可以辦到。 2.通過Lock可以知道執行緒有沒有成功獲取到鎖 3.Lock鎖相當於汽車中的手動擋,相比synchron
Java多執行緒之進階篇(一)
一、執行緒池 1.1 執行緒池的建立 1.1.1 ThreadPoolExecutor 1.1.2 執行緒池的分類
《Java多執行緒程式設計核心技術》(一)多執行緒技能
最近閱讀了一本《Java多執行緒程式設計核心技術》,總結了一下每章的知識點: 第一章,java多執行緒技能 知識點: 1,實現多執行緒程式設計的方式主要有兩種:一是繼承Thread類,重新r
D3D11和D3D12多執行緒渲染框架的比較(一)
1. 前言 D3D12伴隨DirectX12自2014年正式釋出以來已經近3年多時間了。遺憾的是我最近才有時間仔細研究D3D12介面及程式設計方面的內容。D3D12給我總體的感覺用一句話來概括就是——D3D12是一個“顯示卡作業系統!”。 得益於我對
iOS 多執行緒在專案中的應用場景(一)
獲取線上版本號是一件很耗時的操作,所以開闢一個子執行緒,程式碼如下 //檢測新版本 //說明:開闢子執行緒執行耗時程式碼塊,然後在主執行緒中重新整理和顯示 dispatch_async(dispatch_get_global_queue(0, 0
iOS開發-iOS多執行緒開發中踩過的坑-GCD的特性-NSOperation執行緒依賴-iOS多執行緒踩坑小結
本期內容: iOS開發中從其他執行緒回到主執行緒的方法 dispatch_group_create 組的概念 dispatch_sync同步排程主執行緒會死鎖的原因 專案中什麼時候選擇GCD什麼時候選擇NSOperation NSOperation 執行緒依賴
java中多執行緒的建立和啟動(1)
多執行緒概述 1.什麼是多執行緒 執行緒是程式執行的一條路徑,一個程序中可以包含多條執行緒;多執行緒併發執行可以提高程式的效率 2.程序和執行緒之間的關係 作業系統可以同時執行多個任務,每個任務就是程序;程序可以同時執行多個任務,每個任務就是執
網際網路架構多執行緒併發程式設計高階教程(上)
#基礎篇幅:執行緒基礎知識、併發安全性、JDK鎖相關知識、執行緒間的通訊機制、JDK提供的原子類、併發容器、執行緒池相關知識點 #高階篇幅:ReentrantLock原始碼分析、對比兩者原始碼,更加深入理解讀寫鎖,JAVA記憶體模型、先行發生原則、指令重排序 #環境說明:idea、ja
Java多執行緒之進階篇(二)
概述 1.基本原子類 1.1 AtomicBoolean 1.2 AtomicInteger和AtomicLong 2.引用原子類
JAVA多執行緒機制第二彈:(程式碼)Thread的子類建立執行緒
在Java中,執行緒物件的建立是用Threa類或者它的子類建立。 在編寫Thread類的子類時,需要重寫父類的run()方法,其目的是規定執行緒的具體操作,否則執行緒就沒有開始的地方 在這裡,做一個小小總結: ··線上程的編寫的時候,要重寫父類的run()方法,在ru
多執行緒的那點事兒(1)--如何選擇執行緒數
多執行緒向來是一個讓程式設計師頭痛的一個問題,不只是初學者容易犯錯誤,很多老鳥也難免站著中槍。一旦出現問題很難定位和解決,除了可能因為程式設計者知識上的缺陷導致的疏漏外,另一個難題就是問題重現難度大,避免多執行緒導致BUG最好的方法就是預防。 首先,在開始進行多執行
基於QT的多執行緒視訊監控的實現(二)
二丶接著上一節,這節主要講,多屏分割,多屏相互切換 視訊監控很重要的一個環節就是多屏切換了,這裡主要實現的是 1,2,4,8,16,32,64 分屏的相互切換,最多是64分屏。(1)QT 常用到的佈
D3D11和D3D12多執行緒渲染框架的比較(四)
1.命令列表及命令的原生並行性 至此如果你還沒有看暈的話,或者說你已經明白了前面的這些概念鋪墊之後,或許心中還有一個疑問就是為什麼說可以用多個命令列表來記錄可能不同的命令,最後再來執行,這樣
D3D11和D3D12多執行緒渲染框架的比較(三)
1.CPU執行緒和GPU執行緒的區別 另外我們還需要深刻的理解的一個概念就是CPU執行緒和GPU執行緒的區別。 1.1.CPU執行緒 CPU執行緒在Windows作業系統中更多的是指一個
D3D11和D3D12多執行緒渲染框架的比較(二)
1. 多執行緒的一些基礎知識和問題 1.1. 併發和並行 如果你對多執行緒程式設計理解比較深刻的話,那麼首先第一個要搞明白的概念就是“併發”和“並行”的區別,併發很多時候指的是在一個時間
Java多執行緒程式設計模式實戰指南(三):Two-phase Termination模式
本文由本人首次釋出在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-termination 停止執行緒是一個目標簡單而實現卻不那麼簡單的
多執行緒程式設計10例問題(4)
問題:VS2012中MFC,選中控制元件,右鍵,選擇新增變數無反應。 原因:對話方塊名字發生變化導致。 解決方案:在解決方案資源管理器中的資原始檔下找到MultiThread3.rc2,雙擊進入資源檢視,在Diaog下選中對話方塊,在螢幕右側會出現此對話方塊
libcurl多執行緒超時設定不安全(轉載)
from http://blog.csdn.net/sctq8888/article/details/10031219 (1), 超時(timeout) libcurl 是 一個很不錯的庫,支援http,ftp等很多的協議。使用庫最大的心得就是,不仔細看文件,僅僅看著
java多執行緒設計模式 -- 流水線模式(Pipeline)
十一、流水線模式(Pipeline) 1、核心思想 將一個任務處理分解為若干個處理階段,其中每個處理階段的輸出作為下一個處理階段的輸入,並且各個處理階段都有相應的工作者執行緒去執行相應的計算。 2、評價: 充分利用CPU,提高其計算效率。