从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跳不出来 那么就自动终止。

posted @ 2020-12-11 00:40  EvanMeetTheWorld  阅读(34)  评论(0)    收藏  举报