【问题标题】:handling error using xcode 7.0 beta in asynchronous block在异步块中使用 xcode 7.0 beta 处理错误
【发布时间】:2015-09-08 15:23:41
【问题描述】:

我在从 AWS S3 下载文本文件时尝试验证不同的错误,并使用下一段代码:

... above here function receiving String parameters ruta, archivo, archivoLocal
let directorioURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first! as NSURL
let archivoURL = directorioURL.URLByAppendingPathComponent("b\(archivoLocal)")
let downloadRequest = AWSS3TransferManagerDownloadRequest()
downloadRequest.bucket = ruta
downloadRequest.key = archivo
downloadRequest.downloadingFileURL = archivoURL

let transferManager = AWSS3TransferManager.defaultS3TransferManager()
let task = BFTask()
let executor = BFExecutor.mainThreadExecutor()
transferManager.download(downloadRequest).continueWithExecutor(executor, withBlock: { (task) -> AnyObject! in
if task.error != nil {
    if task.error.domain == AWSS3TransferManagerErrorDomain {
        self.processDomainErrorType(AWSS3TransferManagerErrorType(rawValue: task.error.code))
    } else {
        self.processError(task.error)
    }
} else if task.result != nil {
    do {
        let mytext = try String(contentsOfURL: archivoURL, encoding: NSUTF8StringEncoding)
        self.processResult(mytext)
    } catch let urlerror as? NSError {
        self.processError(urlerror)
    }
}
...

我收到错误:

Invalid conversion from throwing function of type '(_) throws -> AnyObject!' to non-throwing function type '@convention(block) (BFTask!) -> AnyObject!'

我从https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html#//apple_ref/doc/uid/TP40014216-CH7-ID10获得了“do { try } catch”语法

我可以通过将 catch 子句替换为:

    } catch _ {
        self.processError(NSError(domain: "String-ContentsOfURL Error", code: 100, userInfo: nil))
    }

当然,这样我永远不会知道 ContentsOfURL 失败的真正原因。

我只能弄清楚为什么会发生此错误是因为此语法仅对 OS X 应用程序和 iOS 有效,错误处理指南位于 https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html#//apple_ref/doc/uid/TP40014097-CH42 只允许第二种语法,除非您拥有从 ErrorType 类型的枚举结构中抛出错误的对象,但情况并非如此,因为我想从 String 对象 contentOfURL 函数中捕获 NSError。

我希望有人能指导我完成这个,也许是 XCode 7 测试版,catch 语法仍然不完整,或者我不应该关心这个函数失败的原因,但我认为确定是什么很重要此函数失败,是否可以在到达 do-try-catch 子句之前对其进行跟踪和修复。

除了上述错误之外,我在 BFTask() 的任务变量分配行中收到警告说“从未使用过不可变值‘任务’的初始化”。我认为这是这个测试版的一个错误,它不包括确认变量任务正在异步块中使用的模式。如果我只需要忽略它,我将非常感谢您对此进行确认。

顺便说一句,我使用 XCode 7 测试版的唯一原因是因为我的客户想在获得苹果会员资格之前评估应用程序。

【问题讨论】:

    标签: ios xcode error-handling xcode7 initwithcontentsofurl


    【解决方案1】:

    Apple 在 Swift 2 中将 NSError 替换为 ErrorType。

    将您自己对 NSError 的显式使用替换为 ErrorType,您不会收到此类编译器错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 2013-01-25
      • 1970-01-01
      相关资源
      最近更新 更多