IOS 多线程的一些总结
下面簡單介紹這三個方法?
?
1.NSThread? ? ??調用方法如下:?
如函數需要輸入參數,可從object傳進去。 (1) [NSThread detachNewThreadSelector:@selector(threadInMainMethod:) toTarget:self withObject:nil];?
(2) NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(threadInMainMethod:) object:nil]; [myThread start];? (3) [obj performSelectorInBackground:@selector(threadMe) withObject:nil];?
提個問題:如果某個ViewController里運行了一個Thread,Thread還沒結束的時候,這個ViewController被Release了,結果會如何??
經過的的測試,Thread不結束,ViewController一直保留,不會執行dealloc方法。
?
2.NSOperation??
NSoperation也是多線程的一種,NSopertaion有2種形式 ? (1) 并發執行 并發執行你需要重載如下4個方法 //執行任務主函數,線程運行的入口函數 - (void)start? //是否允許并發,返回YES,允許并發,返回NO不允許。默認返回NO -(BOOL)isConcurrent? - (BOOL)isExecuting //是否已經完成,這個必須要重載,不然放在放在NSOperationQueue里的NSOpertaion不能正常釋放。 - (BOOL)isFinished 比如TestNSOperation:NSoperaion 重載上述的4個方法, 聲明一個NSOperationQueue, NSOperationQueue *queue = [[[NSOperationQueue alloc ] init] autorelease]; [queue addOperation:testNSoperation];? 它會自動調用TestNSOperation里的 start函數,如果需要多個NSOperation,你需要設置queue的一些屬性,如果多個NSOperation之間又依賴關系,也可以設置,具體可以參考API 文檔。?
?
(2)非并發執行 -(void)main 只需要重載這個main方法就可以了。 ??
??3.GCD
??GCD很強大,我的使用經驗很少。但是scorpiozj 總結的比較全面(http://www.cnblogs.com/scorpiozj/archive/2011/07/25/2116459.html)
? 同時,這篇文章也介紹的比較詳細?http://www.cnblogs.com/vinceoniphone/archive/2011/04/07/2007968.html?
? ?? 官方教程
GCD是和block緊密相連的,所以最好先了解下block(可以查看這里).GCD是C level的函數,這意味著它也提供了C的函數指針作為參數,方便了C程序員.
下面首先來看GCD的使用:
?
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);?
async表明異步運行,block代表的是你要做的事情,queue則是你把任務交給誰來處理了.(除了async,還有sync,delay,本文以async為例).
之所以程序中會用到多線程是因為程序往往會需要讀取數據,然后更新UI.為了良好的用戶體驗,讀取數據的操作會傾向于在后臺運行,這樣以避免阻塞主線程.GCD里就有三種queue來處理.
1. Main queue:
顧名思義,運行在主線程,由dispatch_get_main_queue獲得.和ui相關的就要使用Main Queue.
2.Serial quque(private dispatch queue)
每次運行一個任務,可以添加多個,執行次序FIFO. 通常是指程序員生成的,比如:
NSDate *da = [NSDate date];NSString *daStr = [da description];
const char *queueName = [daStr UTF8String];
dispatch_queue_t myQueue = dispatch_queue_create(queueName, NULL);
3.?Concurrent queue(global dispatch queue):
可以同時運行多個任務,每個任務的啟動時間是按照加入queue的順序,結束的順序依賴各自的任務.使用dispatch_get_global_queue獲得.
所以我們可以大致了解使用GCD的框架:
?
dispatch_async(getDataQueue,^{//獲取數據,獲得一組后,刷新UI.
dispatch_aysnc (mainQueue, ^{
//UI的更新需在主線程中進行
};
}
)
?
由此可見,GCD的使用非常簡單,以我的使用經驗來看,以后會逐步淘汰使用NSOperation而改用GCD.?
?
轉載于:https://www.cnblogs.com/chu888chu888/archive/2011/11/21/2256711.html
總結
以上是生活随笔為你收集整理的IOS 多线程的一些总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA获取系统相关信息
- 下一篇: Access 报表打印之分组页码实现(轉