iOS多任務(wù)并發(fā)設(shè)計(jì)

問(wèn)題假如現(xiàn)在有1w個(gè)任務(wù)需要執(zhí)行,并且在全部執(zhí)行完成之后進(jìn)行一個(gè)提示避归,該怎么做荣月?

思路1:最直接的會(huì)想到dispatch_group,本身就是為一組任務(wù)設(shè)計(jì)的

#define OPERATION_COUNT         10000
#define OPERATION_SLEEP_TIME    0.01f

- (void)myOperation:(NSInteger)index {
    [NSThread sleepForTimeInterval:OPERATION_SLEEP_TIME];    
}

- (void)runMyOperationsWithGCD {
    dispatch_group_t group = dispatch_group_create();
    for (int i = 0; i < OPERATION_COUNT; i++) {
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            [self myOperation:i];
        });
    }
    
    dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"operations are finished");
    });
}

思考1:這段代碼看的應(yīng)該非常清爽梳毙,但是會(huì)創(chuàng)建過(guò)多的線程哺窄,也給系統(tǒng)帶來(lái)了巨大的負(fù)擔(dān),是需要優(yōu)化的账锹。


問(wèn)題假設(shè)在原始問(wèn)題的基礎(chǔ)上約束最多10個(gè)并發(fā)線程萌业,又有什么好的辦法?

思路2:采用iOS的NSOperationQueue奸柬,這個(gè)東西簡(jiǎn)直是按照這種需求設(shè)計(jì)的生年,非常好用

#define MAX_CONCURRENT_COUNT 10
#define OPERATION_COUNT     10000
#define OPERATION_SLEEP_TIME    0.1f

- (void)myOperation:(NSInteger)index {
    NSLog(@"enter myOperation:%ld, thread:%@", (long)index, [NSThread currentThread]);
    [NSThread sleepForTimeInterval:OPERATION_SLEEP_TIME];    
}

- (void)runMyOPerationsWithNSOperation {
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    queue.maxConcurrentOperationCount = MAX_CONCURRENT_COUNT;//設(shè)置最大并發(fā)數(shù)
    for (int i = 0; i < OPERATION_COUNT; i++) {
        [queue addOperationWithBlock:^{
            [self myOperation:i];
        }];
    }
        
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [queue waitUntilAllOperationsAreFinished];//等待所有任務(wù)完成
        NSLog(@"operations are finished");
    });
}

思考2:個(gè)人覺(jué)得,這是最方便的方法廓奕,簡(jiǎn)單明了晶框,沒(méi)有過(guò)多的線程和冗余的代碼。


問(wèn)題如果不使用NSOperation懂从,又有什么好的辦法嗎授段?

思路3:通過(guò)信號(hào)量控制并發(fā),并結(jié)合思路1的dispatch_group實(shí)現(xiàn)組任務(wù)完成后的通知

#define MAX_CONCURRENT_COUNT 10
#define OPERATION_COUNT     10000
#define OPERATION_SLEEP_TIME    0.1f

- (void)myOperation:(NSInteger)index {
    NSLog(@"enter myOperation:%ld, thread:%@", (long)index, [NSThread currentThread]);
    [NSThread sleepForTimeInterval:OPERATION_SLEEP_TIME];
}

- (void)runMyOperationsWithSemaphore {
    //創(chuàng)建信號(hào)量番甩,控制最大并發(fā)數(shù)為10
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(MAX_CONCURRENT_COUNT);
    dispatch_group_t group = dispatch_group_create();
    for (int i = 0; i < OPERATION_COUNT; i++) {
        //wait一次侵贵,semaphore減一,當(dāng)semaphore小于0時(shí)會(huì)一直wait
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            [self myOperation:i];
            //任務(wù)完成后缘薛,觸發(fā)semaphore,以允許新的任務(wù)進(jìn)入
            dispatch_semaphore_signal(semaphore);
        });
    }

    dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"operations are finished");
    });
}

思考3:這種方式其實(shí)是在思路1的基礎(chǔ)上增加了信號(hào)量的并發(fā)限制漱抓,相當(dāng)于一種簡(jiǎn)單的改進(jìn)乞娄。

最后显歧,如果采用最傳統(tǒng)的NSThread,跟信號(hào)量配合范删,可以實(shí)現(xiàn)多任務(wù)并發(fā)到旦,但如何判斷所有任務(wù)都已執(zhí)行完畢,只想到了通過(guò)計(jì)數(shù)的方式添忘,并沒(méi)有想到更好的辦法。如果大家有更好的辦法,歡迎留言拴清,私信!

最最后娄周,附上demo煤辨,地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末众辨,一起剝皮案震驚了整個(gè)濱河市舷礼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛛株,老刑警劉巖育拨,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熬丧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡析蝴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)吨艇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)东涡,“玉大人,你說(shuō)我怎么就攤上這事疮跑。” “怎么了失尖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵掀潮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我仪吧,道長(zhǎng)鞠眉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任出皇,我火速辦了婚禮恶迈,結(jié)果婚禮上谱醇,老公的妹妹穿的比我還像新娘。我一直安慰自己奈附,他們只是感情好煮剧,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著佑颇,像睡著了一般挑胸。 火紅的嫁衣襯著肌膚如雪宰闰。 梳的紋絲不亂的頭發(fā)上簿透,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天老充,我揣著相機(jī)與錄音螟左,去河邊找鬼。 笑死巷嚣,一個(gè)胖子當(dāng)著我的面吹牛奄妨,可吹牛的內(nèi)容都是我干的苹祟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼直焙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奔誓!你這毒婦竟也來(lái)了搔涝?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蜕煌,失蹤者是張志新(化名)和其女友劉穎斜纪,沒(méi)想到半個(gè)月后文兑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡因块,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年贮聂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吓懈。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖隔嫡,靈堂內(nèi)的尸體忽然破棺而出甘穿,到底是詐尸還是另有隱情,我是刑警寧澤温兼,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布募判,位于F島的核電站,受9級(jí)特大地震影響届垫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜装处,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一妄迁、第九天 我趴在偏房一處隱蔽的房頂上張望登淘。 院中可真熱鬧箫老,春花似錦槽惫、人聲如沸界斜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)峭判。三九已至,卻和暖如春奕删,著一層夾襖步出監(jiān)牢的瞬間完残,已是汗流浹背横漏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扎拣,地道東北人素跺。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像侣夷,于是被迫代替她去往敵國(guó)和親仑乌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琴锭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 背景 擔(dān)心了兩周的我終于輪到去醫(yī)院做胃鏡檢查了厕九!去的時(shí)候我都想好了最壞的可能(胃癌)地回,之前在網(wǎng)上查的癥狀都很相似。...
    Dely閱讀 9,245評(píng)論 21 42
  • Dispatch Queues dispatch queues是執(zhí)行任務(wù)的強(qiáng)大工具畅买,允許你同步或異步地執(zhí)行任意代碼...
    YangPu閱讀 648評(píng)論 0 4
  • 原創(chuàng)內(nèi)容,轉(zhuǎn)載請(qǐng)注明出處: http://www.reibang.com/p/ac11fe7ef78c 前言 多線...
    抱緊我的小鯉魚(yú)閱讀 8,818評(píng)論 6 78
  • 昨天看完松哥的演講,其實(shí)內(nèi)心是低落的湃缎,用生命經(jīng)歷生活的人,是能帶其他人沉重的生命思考嗓违!同樣是支教,用心與否比庄,從結(jié)果...
    船長(zhǎng)Captain閱讀 576評(píng)論 1 6
  • 22:00佳窑,沒(méi)有消息父能。抱著僥幸的心理,繼續(xù)等溉委。 22:15,還是沒(méi)有消息…… 22:30瓣喊,手機(jī)依然沒(méi)有半點(diǎn)聲響黔酥。至...
    昵稱(chēng)空白閱讀 448評(píng)論 12 8