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', '~&gt; 3.0' 工作正常。 只是尝试测试Alamofire', '~&gt; 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”的值的主要内容,如果未能解决你的问题,请参考以下文章

无法调用非函数类型“HTTPURLResponse”的值?

无法调用非函数类型 HTTPURLResponse 的值?

Swift 3 错误“无法调用非函数类型 'UITableView!' 的值” [关闭]

错误:无法调用非函数类型的值

无法调用非函数类型“HTTPURLResponse?”的值

快速轮函数。无法调用非函数类型“Int”的值