从Swift代码块看同步异步
最近被IOS里面的同步异步搞得很痛苦。就是下面这段代码:
private func requestFollow(isRefresh: Bool, followeeid: String) -> Bool{
var success = false
if isRefresh {
SVProgressHUD.show()
}
updateViews(dataStatus: .normal)
dataSource.requestFollow(followeeid: followeeid, success: success)
.ensure { [weak self] in
//print("wwe", self!.userId)
if isRefresh {
SVProgressHUD.dismiss()
}
// else {
// self?.tableView.mj_footer?.endRefreshing()
// }
}
.done { [weak self] response in
if response.statusCode == 200 {
SVProgressHUD.showSuccess(withStatus: "请求关注成功!")
success = true
} else if response.statusCode == 302 {
SVProgressHUD.showError(withStatus: Text("您已关注过该用户"))
//show alter here: you have already followed:“您已关注该用户”
}
}
.catch { [weak self] error in
SVProgressHUD.showError(withStatus: Text("添加好友请求失败,请稍后重试!"))
// if isRefresh {
// self?.updateViews(dataStatus: .noNet) //无网络状态
// }
}
print("successRequestFollow:", success)
return success
}
可以很明显的看出来 我是想能最后输出一个东西 使得我能确定这个状态码返回的是200
但是可想而至 无论我怎么折腾 最后返回的都是success==false。
这是因为我经常见的那种普通函数 都是同步的 即所有的东西 都会按顺序执行 然后会返回一个最终结果
可是这个函数不一样 因为里面的http请求是异步的 也就是说 当我return的时候 其实http请求还没有执行完毕。因为函数的执行速度是纳秒级别的 而http请求却是毫秒级别的。
所以这就造成了那种情况,即每次返回的总是false.
这里的处理方法之后需要研究一下 但是现在来说 只要能实现这个功能就行,所以我们加了一个while和一个计时器 如果在规定时间内while跳不出来 那么就自动终止。

浙公网安备 33010602011771号