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