iOS的多線程跟其他像c語言創(chuàng)建的線程的概念不太一樣蓖宦。
多線程模型為一個(gè)個(gè)block組成的queue來實(shí)現(xiàn)多線程編程,無須自己創(chuàng)建線程。
在ios系統(tǒng)底層為你創(chuàng)建了線程池,我們編寫APP只需關(guān)心我們需要完成的任務(wù)block和queue
queue由一個(gè)個(gè)block排隊(duì)組成恼蓬,最前面的queue在系統(tǒng)取走去執(zhí)行block中的代碼,后面的block就會(huì)接上捷枯,一個(gè)queue對(duì)應(yīng)一個(gè)線程會(huì)者幾個(gè)線程 我們無需關(guān)心這個(gè)滚秩。
1. queue
queue分兩種 ?分別是主隊(duì)列和其他隊(duì)列, 其中主隊(duì)列專門負(fù)責(zé)UI同步和不能被阻塞(需要監(jiān)聽用戶及時(shí)響應(yīng)用戶的觸控)淮捆, 任何需要復(fù)雜計(jì)算 持續(xù)時(shí)間長(zhǎng)的行為都交由其他隊(duì)列執(zhí)行。
queue類型:dispatch_queue_t?
創(chuàng)建 queue:?
dispatch_queue_t otherQueue = dispatch_queue_create("queueName", nil);
獲取主隊(duì)列:
?dispatch_get_main_queue();
或者?[NSOperationQueue mainQueue];
2. block
oc中稱為代碼塊 就是其他語言中的匿名函數(shù)和函數(shù)式編程
基本格式 :^(參數(shù)類型 參數(shù)1本股,參數(shù)類型 參數(shù)2) { 需要執(zhí)行的代碼}
3. 如何把需要執(zhí)行的任務(wù)block放入queue攀痊?
通過 diapatch_async( queue, ^{ } ); ?異步方式調(diào)用
還有一種更簡(jiǎn)單的來讓main queue來執(zhí)行block的方式
- (void)performSelectorOnMainThread:(SEL)aMethod?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? withObject:object?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? waitUntilDone:(BOOL)waitUntilDone;
ps: 如何判斷block在哪個(gè)queue,沒有顯示的用dispatch_async函數(shù)指定那就看你block所在函數(shù)是在哪個(gè)queue執(zhí)行就表示block也在那個(gè)queue中拄显。不在main queue的block想執(zhí)行UI操作需回調(diào)main queue來實(shí)現(xiàn).
例子:
根據(jù)網(wǎng)絡(luò)URL下載對(duì)應(yīng)的文件
NSURLRequest *request = [NSURLRequest requestWithURL:
[NSURL URLWithString:@"http://..."]];
NSURLSessionConfiguration * configuration = ...... ;
NSURLSession * session = ...... ;
NSURLSessionDownloadTask *task;
task = [session downloadTaskWithRequest:request?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
/* 想做一些UI動(dòng)作 能不能執(zhí)行苟径? */ ? ? ? ?@1
}];
下載完成的回調(diào)函數(shù)completionHandler是不是在main queue中,是的話可以直接寫ui代碼躬审,不是則要通過函數(shù)dispatch_async回調(diào)main queue來進(jìn)行操作棘街。
接上面的例子代碼 其中session為:
NSURLSession * session = ?[NSURLSession sessionWithConfiguration:configuration delegate:nil ?delegateQueue:[NSOperationQueue mainQueue]];
這樣創(chuàng)建session指定了是在main queue中執(zhí)行下載任務(wù) 即completionHandler在main queuqe中 在@1處可以直接執(zhí)行UI操作
相反
NSURLSession *session =
[NSURLSession sessionWithConfiguration:configuration];
是指派了otherQueue來執(zhí)行下載任務(wù) 所以在 @1 處想執(zhí)行ui操作需回調(diào)main queue
@1處此時(shí)代碼為:
dispatch_async([NSOperationQueue mainQueue], ^{/* ?UI操作 */}); 或者
[self performSelectorOnMainThread:@selector(doUIthings)
withObject:nil ?waitUntilDone: NO];
所以多線程入門 只需理解幾個(gè)概念就行
queue與block的編程模型
main queue和其他queue的不同(main queue 1. 不能阻塞 2. 專門負(fù)責(zé)ui)
其他的像創(chuàng)建queue , 把block放入queue等函數(shù)都必須清楚承边。
水平有限 歡迎指正