[RunLoop 让返回值在耗时操作完成后返回]

来源:互联网 发布:西直门桥主要数据 编辑:程序博客网 时间:2024/06/05 18:41

有这么样一个需求

- (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;    }}
阅读全文
1 0