程式中需要有並行的操作,就會用到多線程
1、
[self performSelectorInBackground:@selector(task) withObject:nil];
2、NSThread代表執行的線程,可以使用該類的對象封裝線程操作,可以使用該類建立、管理線程
a、使用類方法 detachNewThreadSelector: toTarget: withObject:建立新的線程
[NSThread detachNewThreadSelector:@selector(task) toTarget:self withObject:nil];
b、建立NSTheard對象。
NSThread *thr = [[NSThread alloc]initWithTarget:self selector:@selector(task) object:nil];
[thr start];
c、自訂Thread對象 @interface myThread:NSThread @implementation myThread -(void)main { //在此添加線程方法 } myThread *_thread = [[myThread alloc]init];
[myThread start];
3、NSOperationQueue:作為Operation的管理者,OperationQueue負責執行放入其中的所有操作對象
- (IBAction)Caculate:(id)sender
{
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue setMaxConcurrentOperationCount:1];//指定能夠同時並發執行的操作個數
NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(xiazai1) object:nil];
NSInvocationOperation *op2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(xiazai2) object:nil];
NSInvocationOperation *op3 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(xiazai3) object:nil];
[queue addOperation:op1];//將建立好的operation加入運行隊列中
[queue addOperation:op2];
[queue addOperation:op3];
}
//從網上下載圖片
-(void)xiazai1
{
NSData *data1 = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.qqskycn.net/bq/bq_tp/200904/20090404193057343.gif"]];
NSLog(@"data1 = %@",data1);
Image1.image = [UIImage imageWithData:data1];
}
-(void)xiazai2
{
NSData *data2 = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://imgqq.5308.com/20061107/uploadfile/2005/8/11/14511674586.jpg"]];
Image2.image = [UIImage imageWithData:data2];
}
-(void)xiazai3
{
NSData *data3 = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://img1.comic.zongheng.com/comic/image/2009/1/samosekayi/ori/20090217025931686184.jpg"]];
Image3.image = [UIImage imageWithData:data3];
}
4、
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.
最後感慨下,蘋果為吸引開發人員而將開發門檻降的非常低.以多線程編程為例,似乎還沒有比iOS更容易的平台.這無疑會吸引更多的人來淘金,但無疑競爭也會異常激烈.要脫穎而出app在創意上無疑得有獨到之處. 這真的是把雙刃劍,吐槽下~~.