依次调用两个Alamofire函数

Posted

技术标签:

【中文标题】依次调用两个Alamofire函数【英文标题】:Call two Alamofire Function one after another 【发布时间】:2017-12-08 10:20:56 【问题描述】:

我有一个用户类,其中有一个 ID 属性。我做了一个满足此类(ID 值)的 Alamofire 请求。当一个按钮被点击时,我执行另一个发送用户 ID 的 Alamofire 请求。我在第一个请求中有 7 个用户,所以第二个请求完成了 7 次。当点击按钮时,我希望该过程连续进行,以便当我点击按钮时它应该执行第一个请求 -> 第二个请求(7 次) -> 第一个请求 -> 第二个请求(7 次).....问题是它需要等待第一个请求完成以及所有第二个请求。这样做时最好的方法是什么?我正在考虑创建组,但我不确定。

   func cont_like()
    for var i in 0..<3
        let group = DispatchGroup()
        let group2 = DispatchGroup()
        group2.enter()
        group.enter()
        Network.sharedInstance.like_all(completion: 
            group.leave()
        )
        group.enter()
        Network.sharedInstance.get_rec(completion: response in
            print(response)
            group.leave()
        )

        group.notify(queue: .main)
            print("Both Req Done")
            group2.leave()
        
    

第二个请求:

    func like(sender_id: String, completion: @escaping () -> ())
    if let key = api_key
        let headers: HTTPHeaders = [
            "X-Auth-Token": key,
            "Accept": "application/json"
        ]
        Alamofire.request(baseUrl + likeURL + sender_id, method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers).responseData(completionHandler:  (response) in
            let jsonData = JSON(response.data!)

            guard response.result.isSuccess else 
                print("Error while fetching tags: \(response.result.error!)")
                return
            
            if let error = response.error
                print("Error Occured with Request: \(error)")
            
            if let matched = jsonData["match"].bool
                print("Liked!: \(matched)")
                if(matched)

                
            else
                print("There is an error with liking :(")
            

        )
    

第一个请求:

    func get_rec(completion: @escaping (String?) -> ())
    if let key = api_key
        let headers: HTTPHeaders = [
            "X-Auth-Token": key,
            "Accept": "application/json"
        ]
        Alamofire.request(baseUrl + recom, method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers).responseData(completionHandler:  (response) in
            if response.result.isFailure
                completion(nil)
                self.delegate?.metaError()
                return
            else
                do 
                    let decoder = JSONDecoder()
                    let root = try decoder.decode(Root.self, from: response.data!)
                    SharedUsers.sharedUser.populateData(sender: root.data)
                    print(SharedUsers.sharedUser.users[0].id)
                    self.delegate?.updated()
                    completion("Fetched")
                    self.delegate?.updated()

                 catch 
                    print("error: ", error)
                    completion(nil)
                    self.delegate?.metaError()
                
            

        )
    
    else
    print("Error")
    

喜欢所有功能:

func like_all(completion: @escaping() -> ())
        let group2 = DispatchGroup()
        group2.enter()
        for user in SharedUsers.sharedUser.users
            if let id = user.id
                let group = DispatchGroup()
                group.enter()
                let when = DispatchTime.now() + 0.5 // change 2 to desired number of seconds
                DispatchQueue.main.asyncAfter(deadline: when) 
                    Network.sharedInstance.like(sender_id: id)  result in
                        group.leave()
                        print(result)
                    

                
            
            else
                continue
            
        
        group2.leave()
        completion()
    

编辑:我编辑了函数,但仍然调用了第一个请求,而无需等待所有类似的请求。

【问题讨论】:

***.com/questions/11909629/… 如果您异步发送所有第一个请求,然后在每个第一个请求完成后您将其称为第二个请求,会发生什么?这种方法对你有用吗? 您可以使用 GCD 在 swift 3 中使用 DispatchGroup 来实现此目的。当所有任务完成时,您会收到通知。 @InderKumarRathore 我虽然也这样,但认为在第 3、第 4 期。喜欢的电话可以在分配新课程之前以一种或另一种方式调用。它应该等待。 【参考方案1】:

有不同的方法,一种是 DispatchGroup

  let group = DispatchGroup()

    group.enter()
    func like(sender_id: String, completion: @escaping () -> ())
        group.leave()
    

    group.enter()
    func get_rec(completion: @escaping (String?) -> ())
        group.leave()
    

    group.notify(queue: .main) 
        print("both requests done")
    

另一个是 NSOperationQueue by addDependency 。

【讨论】:

我可以为这些群组添加一些延迟吗?例如,我想在 get_rec 完成后等待 3 秒? 无需延迟。 func 像完成块添加 group.leave()。之后 get_rec 开始运行 当我只调用该组一次但我将它放在一个 While(true) 中时它正在工作,以便我可以按顺序调用它。但是当我这样做时,它不起作用。

以上是关于依次调用两个Alamofire函数的主要内容,如果未能解决你的问题,请参考以下文章

在类函数中调用 Alamofire 时出错

Alamofire:无法调用非函数类型“NSHTTPURLResponse”的值?

包装在静态函数中时,Alamofire 4.0“调用中的额外参数'方法'”

Alamofire 4:无法调用非函数类型“HTTPURLResponse?”的值

如何在swift中使用alamofire上传图库图片

如何在 DataProvider 类 Alamofire 函数 swift 中设置协议函数不能正确调用