import UIKit
import Foundation
import Alamofire
import SVProgressHUD
protocol ParseAPIProtocol:class {
func APIresponse(responseDict: NSDictionary)
}
class ParseAPI :NSObject{
// weak var mydelegate : MyProtocols?
weak var delegateAPI:ParseAPIProtocol?
class func ParseUrl(postparameters: [String: AnyObject]!, url:String, current:UIViewController) {
print(postparameters)
print(url)
SVProgressHUD.show()
Alamofire.request(url, method: .post, parameters: postparameters, encoding: URLEncoding.default, headers: nil).responseJSON
{
(response:DataResponse<Any>) in
switch(response.result)
{
case .success(_):
if response.result.value != nil
{
let jsonResult = (try! JSONSerialization.jsonObject(with: response.data!, options: JSONSerialization.ReadingOptions.mutableContainers)) as! NSDictionary
print(jsonResult)
}
break
case .failure(_):
SVProgressHUD.dismiss()
print(response.result.error as Any)
break
}
}
}
每当我得到jsonResult时,我只想调用有趣的API响应来将结果字典解析为viewcontroller类。
我在viewcontroller及其委托上声明了该方法。
但是当我尝试调用协议方法时,它并没有让我访问该方法。可能是我做错了什么。请看看我的方法。
谢谢!
答案 0 :(得分:1)
我看到它的方式有几个问题,虽然很难分辨,因为你没有在视图控制器中显示相关代码 (如何设置委托,如何调用解析API)。
首先,您永远不会使用结果调用您的委托。使用您当前的设置,这甚至是不可能的:您定义ParseAPI
以获得
委托(实例)成员,但将ParseUrl
定义为类func。我想这就是你说的时候的意思,它并没有让我访问方法&#34;。
尝试将其定义为成员函数,然后在成功案例中调用委托:
self.delegateAPI?.APIresponse(responseDict: jsonResult)
在视图控制器中,实例化ParseAPI
实例并使其保持活动状态(例如将其存储在强实例成员中),设置其委托,
并致电ParseUrl(...)
。此调用将立即返回,稍后,当处理请求和响应时,您的委托方法将会
被称为。
class ViewController: UIViewController, ParseAPIProtocol
{
var parser: ParseAPI?
func somewhere()
{
self.parser = ParseAPI()
self.parser!.delegateAPI = self
self.parser!.ParseUrl(postparameters: [:], url: "...", current: self)
}
func APIresponse(responseDict: NSDictionary)
{
print("VC got response:", responseDict)
}
}
其次,永远不会使用current
参数,您可以将其删除。或者您可以删除整个委托事物并替换当前参数
回调,像这样:
func ParseUrl(postparameters: [String: AnyObject]!, url:String, finished: @escaping (_ response: NSDictionary?) -> Void)
{
...
// success case:
finished(jsonResult)
// failure case:
finished(nil)
}
并将其称为:
self.parser!.ParseUrl(postparameters: [:], url: "...", finished: { (response: NSDictionary?) in
// handle response
})
您还可以将回调定义为具有错误参数,以便在出现错误时执行相应操作。
最后,虽然我不知道SVProgressHUD
,但您可能也想在成功案例中致电SVProgressHUD.dismiss()
。