亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何等待異步調度塊完成?

如何等待異步調度塊完成?

慕無忌1623718 2019-07-23 16:37:44
如何等待異步調度塊完成?我正在測試一些使用Grand Central Dispatch進行異步處理的代碼。測試代碼如下所示:[object runSomeLongOperationAndDo:^{     STAssert…}];測試必須等待操作完成。我目前的解決方案如下:__block BOOL finished = NO;[object runSomeLongOperationAndDo:^{     STAssert…     finished = YES;}];while (!finished);看起來有點粗糙,你知道更好的方法嗎?我可以通過調用暴露隊列然后阻塞dispatch_sync:[object runSomeLongOperationAndDo:^{     STAssert…}];dispatch_sync(object.queue, ^{});......但是這可能會暴露太多object。
查看完整描述

3 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

我最近再次討論這個問題并寫了以下類別NSObject

@implementation NSObject (Testing)- (void) performSelector: (SEL) selector
    withBlockingCallback: (dispatch_block_t) block{
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    [self performSelector:selector withObject:^{
        if (block) block();
        dispatch_semaphore_signal(semaphore);
    }];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    dispatch_release(semaphore);}@end

通過這種方式,我可以輕松地將異步調用與回調轉換為測試中的同步調用:

[testedObject performSelector:@selector(longAsyncOpWithCallback:)
    withBlockingCallback:^{
    STAssert…}];


查看完整回答
反對 回復 2019-07-23
  • 3 回答
  • 0 關注
  • 809 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號