Alamofire Singleton返回处理程序

时间:2017-12-03 20:40:00

标签: swift alamofire

我正在尝试为我的alamofire请求创建网络单例,以便为了调用我的API,我只需要执行以下操作:

Services.sharedInstance.useAlamo { (result: Array) in

        case .success: 

            self.userarray = result

            self.tableView.reloadData()
            self.tableView.dataSource = self

            print (result)

       case .failure:

            print ("Request Failed")

}

我设置了单例,可以通过结果,但不确定如何将枚举添加到完成块,以便在调用单例时可以使用.success或.failure。到目前为止,我尝试过这样的事情,但收到了错误:

enum Results<Value> {
            case success(Value)
            case failure(Error)

        }

struct Services {

    static let sharedInstance = Services()

    func useAlamo(finished: @escaping (_ result: [User]) -> Results<String>) {

        var userarray: [User] = []

        Alamofire.request("https://jsonplaceholder.typicode.com/posts").validate().responseData { response in

            switch response.result {

            case .success:

                if let data = response.result.value {

                    userarray = try! JSONDecoder().decode([User].self, from: data)

                    finished(userarray)

                    return .success("string") // Error here: "Type 'Void' has no member 'success'"

                }
            case .failure:

                finished(userarray)

                return .failure("stringfailure") // Error here: "Type 'Void' has no member 'failure'"
            }
        }

    }

}

更新:目标是获得成功和未能从完成块调用的枚举。建议的重复问题与此无关。

1 个答案:

答案 0 :(得分:1)

有很多问题。最重要的问题是您无法从异步完成处理程序返回值。

使用你的枚举声明useAlamo函数没有返回值,但在闭包中传递Results对象。成功通过User数组后,如果失败则传递Error。您必须添加适当的错误,Alamofire调用返回的错误或自己创建的错误。而不是return语句调用finished闭包。

代码未经测试,因为我不使用Alamofire。它将无法编译,因为缺少error个对象。但是你会得到工作流程的印象

struct Services {

    static let sharedInstance = Services()

    func useAlamo(finished: @escaping (Results<[User]>) -> () ) {

        Alamofire.request("https://jsonplaceholder.typicode.com/posts").validate().responseData { response in

            switch response.result {
            case .success:

                if let data = response.result.value {
                    let userarray = try! JSONDecoder().decode([User].self, from: data)
                    finished(.success(userarray))
                } else {
                    // create an error
                    finished(.failure(error))
                }
            case .failure:
                finished(.failure(error))
            }
        }
    }
}

在呼叫侧切换result并处理相关值

var userarray = [User]()

Services.sharedInstance.useAlamo { result in

    switch result {
    case .success(let users):

        self.userarray = users
        self.tableView.reloadData()

        print(users)

    case .failure(let error):

        print ("Request Failed", error)
    }
}