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

Posted

技术标签:

【中文标题】如何在 DataProvider 类 Alamofire 函数 swift 中设置协议函数不能正确调用【英文标题】:how to set protocol function not properly invoke in DataProvider class Alamofire function swift 【发布时间】:2020-01-16 07:10:29 【问题描述】:

我需要在 Alamofire 下载功能中设置协议功能来跟踪和观察进度分数值。我必须尝试实现委托功能,但它不能正确执行并给出错误。我有一个具有 Alamofire 功能的 DataProvider 类,然后我在 ViewController 中调用它。

init(webService: DataProvider = DataProvider()) 上的错误:

'self' used before 'super.init' call
'super.init' isn't called on all paths before returning from initializer

ViewController 代码:

let webService: DataProvider

    init(webService: DataProvider = DataProvider()) 
        //super.init()
        self.webService = webService
        self.webService.delegate = self
    

    required init?(coder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

extension DownloadViewController: MyWebServiceProtocol 
    func progress(_ fractionCompleted: Double) 
        print(fractionCompleted)
    

    func downloadDidSucceed() 
        print("download")
    


    func downloadDidFail(error: Error) 
        // handle error
    


DataProvider.Class

protocol MyWebServiceProtocol: class 
   func progress(_ fractionCompleted: Double)
   func downloadDidSucceed()
   func downloadDidFail(error: Error)


// in class
weak var delegate: MyWebServiceProtocol?

//Alamofire

Alamofire.download(
            url,
            method: .get,
            parameters: nil,
            encoding: JSONEncoding.default,
            headers: nil,
            to: destination).downloadProgress(closure:  (progress) in
                //progress closure
                self.delegate?.progress(progress.fractionCompleted)

                print(progress.fractionCompleted)
            ).response(completionHandler:  (DefaultDownloadResponse) in
                //here you able to access the DefaultDownloadResponse
                //result closure
                callback(DefaultDownloadResponse.response?.statusCode == 200, DefaultDownloadResponse.destinationURL?.absoluteString.replacingOccurrences(of: "file://", with: ""))
                print(DefaultDownloadResponse)
                self.delegate?.downloadDidSucceed()
            )

【问题讨论】:

【参考方案1】:

你应该在使用self对象之前调用super.init(),以便在使用self之前初始化基类的属性。

【讨论】:

在 DataProvider.class init() 已经使用。如果我要在ViewController 中再次使用它,super.init() 会生成错误。 Must call a designated initializer of the superclass 'UIViewController' 明白。你可以让你初始化为方便初始化如下,方便初始化(webService:DataProvider = DataProvider())self.init()self.webService = webService self.webService.delegate = self 现在在fatalError 它给了我错误Fatal error: init(coder:) has not been implemented: file /Users/macuser/Documents/XCodeWork/ABC/ABC/ViewControllers/DownloadViewController.swift 试试这个,var webService: DataProvider? convenience init(webService: DataProvider = DataProvider()) self.init() self.webService = webService self.webService?.delegate = self required init?(coder aDecoder: NSCoder) super.init(coder: aDecoder) 完成了那个。这次没有错误,但没有调用func progress(_ fractionCompleted: Double) print(fractionCompleted) ,即使我为它设置了断点。

以上是关于如何在 DataProvider 类 Alamofire 函数 swift 中设置协议函数不能正确调用的主要内容,如果未能解决你的问题,请参考以下文章

PHPUnit:使用@dataProvider时“找不到类'Eloquent'”

在setupBeforeClass之后有没有办法执行dataprovider函数?

如何根据已更改的绑定 dataProvider 内容调整 Flex 3 ComboBox 宽度?

testng dataprovider接入msyql db初始化参数遇见的问题记录

dataProvider数据获取存储数据库

DataProvider结合数据库实现数据驱动