首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSFileCoordinator在Swift中的奇怪案例

NSFileCoordinator在Swift中的奇怪案例
EN

Stack Overflow用户
提问于 2022-09-18 15:45:29
回答 1查看 84关注 0票数 2

尽管NSFileCoordinator是一个非常重要的类,但它似乎还没有获得任何seems认证。它没有被赋予任何async选项;您必须提供一个完成处理程序。此外,它需要一个NSErrorPointer而不是标记为throws,并且在完成处理程序中不能引用切入点:

代码语言:javascript
复制
let url = URL(fileURLWithPath: "fakepath")
var error: NSError?
NSFileCoordinator().coordinate(readingItemAt: url, error: &error) { url in
    let theError = error
    print(theError as Any)
}

这会导致一个错误:“同时访问error,但是修改需要独占访问。”

如果我无法从块内部访问错误,这有什么用?我怎么才能进入它?当然不是在块之后;完成处理程序是异步调用的(因为我们必须等待协调访问是可能的),所以在块之后,即使实际上存在错误,错误始终是nil

(我注意到苹果自己的示例代码避免了这个问题,根本不检查它的error变量的值。)

EN

回答 1

Stack Overflow用户

发布于 2022-09-18 15:45:29

显然,这种方法比我想象的还要奇怪。根据文档,如果有错误,则永远不会调用完成处理程序。因此,在完成处理程序之后检查error是否为非nil值实际上可能有些帮助。

此外,docs还表示,您需要设置一个单独的"sentinel“值,以表示最初的失败,然后将其设置为在完成处理程序中表示成功。因此,规范的架构应该是:

代码语言:javascript
复制
let url = URL(fileURLWithPath: "fakepath")
var failure = true
var error: NSError?
NSFileCoordinator().coordinate(readingItemAt: url, error: &error) { url in
    failure = false
}
if failure {
    print(error as Any)
}

我从来没有见过这个架构被使用过,但这似乎是你应该做的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73764142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档