前段時間寫工廠測試程序,遇到個小問題,就是在發測試命令時,因爲回調函數是個block,而block是異步處理的。致使結果沒法及時返回。異步
查看資料後,我是這麼處理的函數
#define TestNeedsToWaitForBlock() __block BOOL blockFinished = NO #define BlockFinished() blockFinished = YES #define WaitForBlock() while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true) && !blockFinished)
- (void)setAndGetStepGoal:(int)goal { NSLog(@"測試設置運動目標值:%d", goal); { TestNeedsToWaitForBlock(); [CommandInterface setSteps:goal completion: ^(BOOL success, NSDictionary *info) { BlockFinished(); }]; WaitForBlock(); } { TestNeedsToWaitForBlock(); [CommandInterface getGoal: ^(BOOL success, NSDictionary *info) { int deviceGoal = [info[@"steps"] intValue]; NSLog(@"設置運動目標值結果:%d>>>>>>%d", goal, deviceGoal); XCTAssertEqual(goal, deviceGoal, @"goal與指望不符"); BlockFinished(); }]; WaitForBlock(); } }
原理其實很簡單,使用 CFRunLoopRunInMode,阻止線程退出,等待系統消息。oop