IOS開發之多線程

來源:互聯網
上載者:User

程式中需要有並行的操作,就會用到多線程

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在創意上無疑得有獨到之處. 這真的是把雙刃劍,吐槽下~~.




相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.