iOS - 无法调用非函数类型“NSProgress”的值
Posted
技术标签:
【中文标题】iOS - 无法调用非函数类型“NSProgress”的值【英文标题】:iOS - Cannot call value of non-function type 'NSProgress' 【发布时间】:2016-07-12 10:56:43 【问题描述】:我正在尝试使用 Alamofire 下载文件,但取得了进展。但我在progress
行收到此错误。
Cannot call value of non-function type 'NSProgress'
有什么问题?我见过的所有例子,即the official one,都做同样的事情!
Alamofire.download(.GET, nsurl!.absoluteString, destination: (temporaryURL, response) in
return filepath
)
.progress (bytesRead, totalBytesRead, totalBytesExpectedToRead) in // <------ ERROR HERE
dispatch_async(dispatch_get_main_queue(),
self.progressBar?.progress = totalBytesRead / totalBytesExpectedToRead
)
.response (request, response, _, error) in
self.loadImageFromFile(filepath.absoluteString)
编辑:
根据@mvoelkl 的建议,我在进度函数中添加了括号。但结果保持不变:
【问题讨论】:
我还在寻找这个问题的答案! @FarisSbahi 只需使用 NSURLSession,下载文件就像 Alamofire 一样简单。 很公平。我认为是时候切换回纯原生模式了。第三方库将永远不会看到支持跟上 Xcode 和 Swift 的持续开发,只要它们仍然像现在一样资金不足。 【参考方案1】:这对我有用。
Alamofire.download(.GET, nsurl!.absoluteString, destination: (temporaryURL, response) in
return file path
)
.progress bytesRead, totalBytesRead, totalBytesExpectedToRead in
let status = Float(totalBytesRead/totalBytesExpectedToRead)
dispatch_async(dispatch_get_main_queue(),
self.progressBar?.progress = status
)
.response (request, response, _, error) in
self.loadImageFromFile(filepath.absoluteString)
totalBytesExpectedToRead 可能不在上面起作用。它有时会返回 -1,因此您可能需要插入正在下载的文件的大小而不使用 Alamofire。
【讨论】:
【参考方案2】:对我来说,解决方案是在progress.fractionCompleted 周围添加Float,所以像这样使用它:
.uploadProgress progress in
self.updateProgressBar(imagesToDo: images.count, prog: Float(progress.fractionCompleted))
感谢: https://github.com/Alamofire/Alamofire/issues/1652#issuecomment-259020449
【讨论】:
【参考方案3】:我希望在更新您的 Alamofire pod
时解决此问题。
这里提一下这个问题:-https://github.com/SwiftyJSON/Alamofire-SwiftyJSON/issues/40
【讨论】:
谢谢,但不幸的是,这是我尝试的第一件事 :-( 我更新了 pod,清理并重建了整个项目,但问题仍然存在。 我正在使用Alamofire', '~> 3.0'
工作正常。
只是尝试测试Alamofire', '~> 3.0'
它的工作。
我无法降级 pod!我应该删除文件然后运行pod install
吗?
不!即使完全移除 Alamofire 吊舱然后安装它也不起作用。【参考方案4】:
遇到同样的问题,使用以下代码修复:
Alamofire.upload(.PUT, url, file: file)
.progress( (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
print("test")
)
注意为 .progress() 添加的括号,通过使用 Xcode 生成代码存根找到它。文档中似乎有错误,如果您能确认这一点,我们应该在 GitHub 上提出问题;)
【讨论】:
.response
具有完全相同的语法,没有括号并且可以工作。我不认为这是问题所在。我认为其他一些变量正在掩盖我的 Alamofire version 中的进度功能。即,有一个具有相同名称的变量。
好吧,如果我是正确的,我认为您的解决方案可能有意义。添加括号可以使调用显式地表明我们想要一个方法,而不是一个变量。我不是快速专家,但可能就是这样。
不。没用。检查我的“编辑”。无论如何谢谢:-)
似乎你正在调用属性 progress (github.com/Alamofire/Alamofire/blob/master/Source/…) 而不是方法 progress(closure: ((Int64, Int64, Int64) -> Void )? = nil) -> 自我 (github.com/Alamofire/Alamofire/blob/master/Source/…)。尝试清洁和构建?
哦,我已经试过一千次了。老实说,我不知道我做错了什么导致属性调用而不是函数调用,除了这个版本的 alamofire 中有一个错误。【参考方案5】:
这个问题也困扰着我。这是由 NSURLRequest.progress 和 Alamofire.Request.progress 的模棱两可的问题引起的。
为了解决这个问题,我修改了 Alamofire 的源代码。
打开 Alamofire/Request.swift (v3.4.x)
在第 141 行,将函数重命名为非进度,我选择了 requestProgress。
发件人:
public func progress(closure: ((Int64, Int64, Int64) -> Void)? = nil) -> Self
收件人:
public func requestProgress(closure: ((Int64, Int64, Int64) -> Void)? = nil) -> Self
像以前一样继续使用该函数,没有编译器问题。
【讨论】:
我认为如果有人使用拉取请求对 repo 进行了更改,那就更好了。我建议不要在本地版本的 alamofire 中进行更改。以上是关于iOS - 无法调用非函数类型“NSProgress”的值的主要内容,如果未能解决你的问题,请参考以下文章