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

有这么样一个需求


- (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;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值