如何在 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.classinit()
已经使用。如果我要在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 宽度?