有这么样一个需求
- (NSString*)waittingFunc{
// 这里执行耗时操作
NSString *param = [self 某耗时操作方法];
return param;
}
可以预见的是, waittingFunc()的运行结果一定是返回nil,
而不是等到耗时操作执行完成,且有值返回赋值给param之后,才执行
return param;
因此,就需要一个办法, 让 return param;
延迟到耗时操作有返回值给到 param之后, 再进行.
如上图
可以把耗时等到的方法 加入循环中
//将耗时操作加入事件循环
[NSThread detachNewThreadSelector:@selector(waitLongitudeAndLatitude)toTarget:self withObject:nil];
可以看到
while(!_runLoopOver){
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
在循环结束标识一直未No的过程中, 线程一直被等待,直到循环结束标识在耗时操作成功且被修改为Yes之后, 事件循环才得以跳出,return
操作才得以继续.
如果想要耗时完成后直接回调,也可以这样写
_runLoopOver 循环结束标识初始化为NO,等耗时操作完成,修改循环结束标识为YES,即可跳出循环,代码继续执行,完成回调
- (NSArray *)startUpdatingLocation{
//循环结束标识 - 初始化
_runLoopOver = NO;
//开始定位 - 等待回调 - 耗时操作
[self.locationManager startUpdatingLocation];
//只要循环结束标识为NO,则当前流程一直等待,(仅当前流程等待,不影响其他线程执行或整个程序执行)
while(!_runLoopOver){
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
//一旦获取经纬度数组回调, 则当前流程执行返回值返回
if (_runLoopOver) {
return _locationArr;
}
}