从协议访问方法到viewcontroller

时间:2017-03-17 06:50:52

标签: swift3 protocols

enter image description here我只是在实现对象类来访问方法和协议。以下

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及其委托上声明了该方法。

但是当我尝试调用协议方法时,它并没有让我访问该方法。可能是我做错了什么。请看看我的方法。

谢谢!

1 个答案:

答案 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()