單元測試之block

前段時間寫工廠測試程序,遇到個小問題,就是在發測試命令時,因爲回調函數是個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

相關文章
相關標籤/搜索