在异步块中使用xcode 7.0 beta处理错误

时间:2015-06-23 01:29:03

标签: ios xcode error-handling xcode7 initwithcontentsofurl

我正在尝试从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对象,contentsOfURL函数中捕获NSError。

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

除了上述错误之外,我在BFTask()的任务变量赋值行中收到一条警告,说“永远不会使用”初始化不可变值'任务'。我认为这是这个测试版的一个错误,它不包括承认变量任务正在异步块中使用的模式。我很欣赏这方面的一些确认,如果我只是需要忽略它。

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

1 个答案:

答案 0 :(得分:0)

Apple在Swift 2中用ErrorType替换了NSError。

使用ErrorType替换您自己对NSError的显式用法,并且您不会遇到此类编译器错误。