国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

iOS多線程技術(shù)

2019-11-14 18:29:04
字體:
供稿:網(wǎng)友

iOS多線程技術(shù)主要分配NSThread、NSOperation和GCD。下邊來簡單的介紹一下吧。

隨性一點,就不按照順序來了。所以先介紹一下NSOperation。

------------------------------------------------------------------------------NSOperation------------------------------------------------------------------------------

NSBlockOperation:

它是NSOperation的一個具體的子類,它管理著并發(fā)執(zhí)行的一個或者多個塊操作。你可以使用這個對象一次執(zhí)行多個連續(xù)的塊,而沒有必要去為每一個操作創(chuàng)建分開的操作對象。當執(zhí)行超過一個block時,操作自己在所有塊執(zhí)行完畢后結(jié)束。

NSInvocationOperation:

它是NSOperation的一個具體子類,它管理執(zhí)行一個單獨的封裝的任務(wù)作為一個調(diào)用。你可以使用這個類開始一個調(diào)用指定對象的選擇器操作。這個類實現(xiàn)的是非并發(fā)操作。

NSOperationQueue:

該類控制一套NSOperation對象的執(zhí)行。當把operation添加到隊列,它會一直存在在該隊列中,直到確信它取消或者結(jié)束執(zhí)行它的任務(wù)。在queue(還沒有執(zhí)行)中的operation都是自己組織執(zhí)行根據(jù)優(yōu)先級和相互作用對象依賴。一個application可能會創(chuàng)建多個操作隊列,然后執(zhí)行他們其中的任何一個操作。

需要注意:NSOperationQueue為NSOperation分配不同的線程來執(zhí)行。

 

- (void)testOperationQueue {    NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];    NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"blockOperation1:%p",[NSThread currentThread]);            }];    NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"blockOperation2:%p",[NSThread currentThread]);    }];    NSBlockOperation *blockOperation3 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"blockOperation3:%p",[NSThread currentThread]);    }];        [operationQueue addOperation:blockOperation1];    [operationQueue addOperation:blockOperation2];    [operationQueue addOperation:blockOperation3];}

上面是一個簡單的測試程序,我們可以看到在一個NSOperationQueue中添加了三個塊操作。然后執(zhí)行結(jié)果如下:

第一次執(zhí)行:

2015-08-21 09:25:24.954 GCD[1251:280098] main Thread is 0x7ff3fc111ac02015-08-21 09:25:24.955 GCD[1251:280205] blockOperation3:0x7ff3f8f09ea02015-08-21 09:25:24.955 GCD[1251:280206] blockOperation1:0x7ff3fc31dd502015-08-21 09:25:24.955 GCD[1251:280207] blockOperation2:0x7ff3f8f09dc0

可見NSOperationQueue為NSBlockOperation分配了不同的線程。而是是并發(fā)操作。也就是說NSOperation默認是并發(fā)執(zhí)行的,要想串行執(zhí)行很簡單,只需要設(shè)置一下NSOperationQueue的一個屬性即可:

  operationQueue.maxConcurrentOperationCount = 1;

該屬性來控制NSOperationQueue的最大并發(fā)數(shù)量,當設(shè)置為1是就是串行執(zhí)行了。

接下來看看下邊的代碼:

- (void)testOperationQueue {//    NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];    NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"blockOperation1:%p",[NSThread currentThread]);            }];    NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"blockOperation2:%p",[NSThread currentThread]);    }];    NSBlockOperation *blockOperation3 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"blockOperation3:%p",[NSThread currentThread]);    }];//    operationQueue.maxConcurrentOperationCount = 1;//    [operationQueue addOperation:blockOperation1];//    [operationQueue addOperation:blockOperation2];//    [operationQueue addOperation:blockOperation3];    [blockOperation1 start];    [blockOperation2 start];    [blockOperation3 start];}

我沒有將NSBlockOperation放到NSOperationQueue中,而是直接自己調(diào)用了start方法,此時會有什么結(jié)果呢???????

看結(jié)果:

2015-08-21 09:33:21.451 GCD[1423:316980] main Thread is 0x7fe178a11a702015-08-21 09:33:21.451 GCD[1423:316980] blockOperation1:0x7fe178a11a702015-08-21 09:33:21.452 GCD[1423:316980] blockOperation2:0x7fe178a11a702015-08-21 09:33:21.452 GCD[1423:316980] blockOperation3:0x7fe178a11a70

結(jié)果表明:當我直接去調(diào)用NSOperation的start方法時,此時所有的NSOperation都是在主線程上執(zhí)行的。因為他們的線程地址一樣。而且是順序執(zhí)行的。

此外,NSOperation還提供了cancel方法,不過這里cancel只能取消狀態(tài)為Ready、Finish的NSOperation,不能取消正在執(zhí)行的操作。

再此外,NSOperation還提供了addDependency:方法。

addDependency方法的作用是使接收者一欄指定操作的完成。接收者不考慮去執(zhí)行它自己直到所有它的依賴操作結(jié)束執(zhí)行。如果接收者準備執(zhí)行它的任務(wù),添加依賴就沒有實際性的影響了。該方法可能改變接收者的isReady和依賴屬性。舉個例子:

 [operation3 addDependency:operation2];    //操作3依賴于操作2

如上邊那句代碼,意思是operation3依賴于operation2的操作,如果operation2沒有執(zhí)行,并且operation3還沒有準備執(zhí)行它的任務(wù),那么他們的執(zhí)行順序一定是operation2先執(zhí)行,然后operation3后執(zhí)行。

------------------------------------------------------NSBlockOperation結(jié)束---------------------------------------------------------------------------------

NSInvocation

上邊已經(jīng)介紹了這個類的大概作用,現(xiàn)在來看看它的使用:

- (void)viewDidLoad {    [super viewDidLoad];    NSLog(@"main Thread is %p",[NSThread mainThread]);    [self nsInvocationOperationTest];}- (void)nsInvocationOperationTest {    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(test) object:nil];    [operation start];}- (void)test {    NSLog(@"operation:%p",[NSThread currentThread]);}

執(zhí)行結(jié)果如下:

2015-08-21 10:52:23.359 GCD[2193:756929] main Thread is 0x7f9442e07fe02015-08-21 10:52:23.360 GCD[2193:756929] operation:0x7f9442e07fe0

操作對象默認在主線程中執(zhí)行,這個和NSBlockOperation一樣。如果是多個則是串行執(zhí)行。如果我們沒有把它放在NSOperationQueue中,都是在主線程執(zhí)行。

NSOperation總結(jié):

NSBlockOperation可以單獨的調(diào)用start執(zhí)行,但是此時都是再主隊列中執(zhí)行的。

NSBlockOperatioin可以添加到NSOperationQueue中執(zhí)行,此時都是新建的線程執(zhí)行。可以通過cancel取消ready和執(zhí)行完畢的線程和addDependency設(shè)置線程依賴。

-------------------------------------------------------------------------------------NSOperation結(jié)束-------------------------------------------------------------------------------------

NSThread

它是比NSOperation和GCD都要輕量級的線程。

它有兩種直接創(chuàng)建形式

 [[NSThread alloc] initWithTarget:<#(id)#> selector:<#(SEL)#> object:<#(id)#>];  [NSThread detachNewThreadSelector:<#(SEL)#> toTarget:<#(id)#> withObject:<#(id)#>]

也就是第一個種使用實例方法。initWithTawrget...那個。第二個是使用的類方法。

第一種創(chuàng)建的線程是先創(chuàng)建線程對象,然后在運行線程操作,需要手動調(diào)用start方法。

第二種是直接創(chuàng)建線程并且開始運行線程。

還有一種不顯式創(chuàng)建線程的方法:

    [self performSelector:<#(SEL)#> withObject:<#(id)#>]

就是使用NSObject的類方法。

---------------------------------------------------------------------------NSThread就這么多吧---------------------------------------------------------------------------

至于GCD,請參考這里

現(xiàn)在來對比一下三者:

NSThread:

優(yōu)點:比其他兩個輕量級、使用簡單

缺點,需要自己管理線程的生命周期、線程同步、加鎖、睡眠等。

NSOperation:

優(yōu)點:不需要關(guān)心線程管理以及數(shù)據(jù)同步

NSOperation是面向?qū)ο蟮摹?/span>

GCD:

iOS4.0+才能使用,是替代NSThread/NSOperation的高效和強大的技術(shù)。

它是基于C語言的。

------------------------------------------------------------------先介紹這么多吧------------------------------------------------------------------

addDependency


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 册亨县| 伊宁市| 大石桥市| 余干县| 莫力| 遂川县| 礼泉县| 伊春市| 榆社县| 淮阳县| 天柱县| 宜阳县| 邹城市| 库尔勒市| 密云县| 隆子县| 永顺县| 怀宁县| 天峻县| 东兴市| 宁陕县| 荃湾区| 高青县| 洛扎县| 深水埗区| 惠东县| 霍林郭勒市| 左权县| 江西省| 湘潭市| 龙山县| 江阴市| 长葛市| 武陟县| 安图县| 天柱县| 梓潼县| 永昌县| 水富县| 抚宁县| 寿阳县|