欢迎使用 Swift :)
您将同步和异步代码混合在一起。
当您调用 login 时,您希望它立即返回 [String : String] 类型的答案。
但是在您的登录方法中,您随后会执行无法立即返回的网络调用...这就是对 Alamofire.request 的调用将完成块作为参数的原因。
所以...您需要更改您的登录方法:
不会立即返回任何东西(它不能这样做......登录需要我们进行网络调用记住)
登录成功后,需要一个完成块来调用。
可以这样做:
public func login(userName: String, password: String, loginCompletion: @escaping ([String : String]) -> ())
欢迎使用 Swift :)
您将同步和异步代码混合在一起。
当您调用 login 时,您希望它立即返回 [String : String] 类型的答案。
但是在您的登录方法中,您随后会执行无法立即返回的网络调用...这就是对 Alamofire.request 的调用将完成块作为参数的原因。
所以...您需要更改您的登录方法:
不会立即返回任何东西(它不能这样做......登录需要我们进行网络调用记住)
登录成功后,需要一个完成块来调用。
可以这样做:
public func login(userName: String, password: String, loginCompletion: @escaping ([String : String]) -> ())
这里我们有一个函数,它接受一个 String 类型的 userName、一个 String 类型的密码和一个 loginCompletion 类型的函数,它再次接受一个 [String : String] 字典作为参数。请注意,该方法不返回任何内容。
现在您几乎可以像以前一样调用您的 makeWebServiceCall:
let loginrequest = JsonRequests.loginRequest(userName: userName, password: password)
makeWebServiceCall(urlAddress: URL, requestMethod: .post, params: loginrequest, completion: { (JSON : Any) in
//Now we are ready, the login call has returned some data to you.
//You have an attribute named JSON of type Any, which you need to convert to [String : String], and then you can call loginCompletion with that, like so:
loginCompletion(yourConvertedDictionaryHere)
})
这是完整的新登录方法:
public func login(userName: String, password: String, loginCompletion: @escaping ([String : String]) -> ()) {
let loginrequest = JsonRequests.loginRequest(userName: userName, password: password)
makeWebServiceCall(urlAddress: URL, requestMethod: .post, params: loginrequest, completion: { (JSON : Any) in
//Now we are ready, the login call has returned some data to you.
//You have an attribute named JSON of type Any, which you need to convert to [String : String], and then you can call loginCompletion with that, like so:
loginCompletion(yourConvertedDictionaryHere)
})
}
欢迎使用 Swift :)
您将同步和异步代码混合在一起。
当您调用 login 时,您希望它立即返回 [String : String] 类型的答案。
但是在您的登录方法中,您随后会执行无法立即返回的网络调用...这就是对 Alamofire.request 的调用将完成块作为参数的原因。
所以...您需要更改您的登录方法:
不会立即返回任何东西(它不能这样做......登录需要我们进行网络调用记住)
登录成功后,需要一个完成块来调用。
可以这样做:
public func login(userName: String, password: String, loginCompletion: @escaping ([String : String]) -> ())
这里我们有一个函数,它接受一个 String 类型的 userName、一个 String 类型的密码和一个 loginCompletion 类型的函数,它再次接受一个 [String : String] 字典作为参数。请注意,该方法不返回任何内容。
现在您几乎可以像以前一样调用您的 makeWebServiceCall:
让 loginrequest = JsonRequests.loginRequest(userName: userName, password: password)
makeWebServiceCall(urlAddress: URL, requestMethod: .post, params: loginrequest, completion: { (JSON: Any) in
//现在我们准备好了,登录调用已经返回了一些数据给你。
//你有一个名为 JSON 的 Any 类型的属性,你需要将它转换为 [String : String],然后你可以用它调用 loginCompletion,如下所示:
loginCompletion(yourConvertedDictionaryHere)
})
以下是完整的新登录方法:
public func login(userName: String, password: String, loginCompletion: @escaping ([String : String]) -> ()) {
让 loginrequest = JsonRequests.loginRequest(用户名:用户名,密码:密码)
makeWebServiceCall(urlAddress: URL, requestMethod: .post, params: loginrequest, completion: { (JSON: Any) in
//现在我们准备好了,登录调用已经返回了一些数据给你。
//You have an attribute named JSON of type Any, which you need to convert to [String : String], and then you can call loginCompletion with that, like so:
loginCompletion(yourConvertedDictionaryHere)
})
}
然后你像这样调用你的登录方法:
retur.login(userName: "root", password: "admin01") { stringDictionary: [String : String] in
//here you have your stringDictionary which you can use as pleased
}
希望对你有所帮助。