微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

强制 FileManager().copyItem(_:_) 超时

如何解决强制 FileManager().copyItem(_:_) 超时

我正在使用

try FileManager.default.copyItem(at: inFile,to: outFile)

问题在于它是一个存在问题的网络上的大文件,并且由无人值守的东西完成。我希望能够告诉 FileManager 只需要一分钟来完成复制,否则就不行了。

我在文档中似乎找不到它,我的冰福今天很弱。

解决方法

我最终使用 dispatchWorkItem 和自定义错误结构扩展了 FileManager。

public extension FileManager {
    struct TimeoutError:Error{
        let source:URL
        let destination:URL
        let timeOut:Double
    }

    func timedOutCopy(at source:URL,to destionation:URL,timeOut:Double = 15.0) throws {
        var cpError:Error?
        let d = DispatchWorkItem(block: {
            do {
                try self.copyItem(at: source,to: destionation)
            } catch {
                cpError = error
            }
        })
        DispatchQueue.global().async(execute: d)
        if d.wait(wallTimeout: DispatchWallTime.now() + timeOut) != .success {
            d.cancel()
            throw TimeoutError(source: source,destination: destionation,timeOut: timeOut)
        } else {
            if let cpError = cpError {throw cpError}
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。