一個應用程序即一個進程读存,一個進程中可以開多條線程微姊;多線程編程,也叫并發(fā)編程烫映。
Mach是第一個以多線程方式處理任務的系統(tǒng),因此多線程的底層是基于Mach的線程噩峦。開發(fā)中很少用Mach級的線程锭沟,因為Mach級的線程沒有提供多線程的基本特征,線程之間是獨立的识补。
- C語言的POSIX接口:#include <pthread.h>族淮;
- OC的NSThread;
- C語言的GCD接口(原生的)(性能最好凭涂,代碼更簡潔)(充分利用系統(tǒng)的核)(Mac iOS內核是UNIX)祝辣;
- OC的NSOperation和NSOperationQueue(基于GCD);
多線程之間的通信
(1)
[self performSelector:<#SEL#> onThread:<#NSThread#> withObject:@”123” waitUntilDone:(<BOOL>)];
(2)NSMachPort
實例:
- 控制器向服務器發(fā)送數(shù)據請求切油,在子線程中實現(xiàn)蝙斜;回到主線程刷新UI界面。
// 在異步線程做事情
dispatch_async(dispatch_get_main_queue(), ) {
// 回到主線程刷新UI界面
}
網絡圖片處理問題中怎么解決一個相同的網絡地址重復請求的問題
- (1)使用SDWebImage澎胡;
- (2)開辟子線程下載圖片孕荠,緩存處理;
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
NSData*data = [NSData dataWithContentsOfURL:url ];
cell.imageView.image = [UIImage imageWithData:data];
}];
[self.queue addOperation:operation];
GCD的底層實現(xiàn)
(1)iOS和OS X的核心是XNU內核攻谁,因此GCD是基于XNU內核實現(xiàn)的稚伍;
(2)GCD的API全部在libdispatch庫中;
(3)GCD的底層實現(xiàn)主要有Dispatch Queue和Dispatch Source戚宦;
- Dispatch Queue:管理block个曙,管理操作在主線程或者異步線程執(zhí)行;
- Dispatch Source:處理事件受楼;
dispatch_async(dispatch_queue_t, <#(void)block#>);
GCD&NSOperation
(1)GCD是純C語言的API垦搬,NSOperationQueue是基于GCD的OC版本封裝祠挫;
(2)GCD只支持FIFO的隊列,NSOperationQueue可以很方便的調整執(zhí)行順序悼沿,和最大并發(fā)數(shù)等舔;queue.maxConcurrentOperationCount = 1;
(3)GCD的執(zhí)行速度比NSOperationQueue快;
(4)GCD不支持KVO糟趾;
(5)NSOperation可以輕松在Operation間添加依賴慌植,設置執(zhí)行順序,而GCD需要寫很多的代碼才能實現(xiàn)义郑;
(6)NSOperation可以設置對大并發(fā)數(shù)蝶柿,以及優(yōu)先級;
(7)NSOperationQueue支持KVO非驮,可以監(jiān)測operation是否正在執(zhí)行(isExecuted)交汤,是否結束(isFinished),是否取消(isCanceled)劫笙;
(8)NSOperation基于GCD芙扎, 支持KVO,[operation isFinished]監(jiān)聽operation是否執(zhí)行完成填大,監(jiān)聽任務的執(zhí)行情況
(9)NSOperation速度比GCD慢戒洼, 要求時刻監(jiān)聽,使用NSOperation
(10)使用規(guī)則:
- 任務之間不太相互依賴:GCD允华;
- 任務之間有依賴或者要監(jiān)聽任務的執(zhí)行情況:NSOperationQueue圈浇;
GCD以及block的使用要注意些什么
(1)循環(huán)引用
(2)block的內存管理
- MRC:__block
- ARC:__weak/__unsafe_unretained
block
block里面所有的代碼會自動執(zhí)行,并且在后臺執(zhí)行靴寂。把下載操作放在block里面磷蜀,系統(tǒng)會把下載操作放在子線程中執(zhí)行,下載完成百炬,回到主線程填充圖片數(shù)據褐隆。
self.images[@”124123.png”] = downloadImage;
// 下載完成,存入緩存
block的內存管理
- 默認放在棧里面
- 調用copy方法收壕,是放在堆里面
Socket, TCP/IP, UDP, XMPP, HTTP
Http:超文本傳輸協(xié)議妓灌,用于網絡數(shù)據傳輸?shù)母袷?/p>
- 短鏈接,一次性的
- 只有服務器能接收http請求蜜宪,客戶端不能接受http請求
- 適合做一對一的相應
Socket:套接字虫埂,是一個用于傳輸網絡數(shù)據的工具,創(chuàng)建鏈接最耗時 - TCP/IP:傳輸協(xié)議
- 適合聊天
- XMPP
- 長鏈接
- 傳輸速度慢(相對UDP)圃验,不會丟失數(shù)據包(安全)
- UDP:傳輸協(xié)議
- 一般用在游戲里面
- 局域網游戲
- 網絡游戲
- 傳輸速度快掉伏,容易丟數(shù)據包(不安全)
- 大文件傳輸只能用Socket
- 文件斷點續(xù)傳,使用socket,其他情況使用AFN
XMPP:做即時通訊(基于TCP/IP)
socket可以發(fā)送TCP\IP斧散,UDP供常,HTTP請求
- 大文件傳輸只能用socket,支持斷點續(xù)傳
- 上傳圖片使用http請求
- HTTP是一對一請求
音頻壓縮
音頻序列服務
音頻文件 -> 字節(jié)壓縮
數(shù)據壓縮框架