FileManager MoveItem 回调 - Swift

Posted

技术标签:

【中文标题】FileManager MoveItem 回调 - Swift【英文标题】:FileManager MoveItem Callback - Swift 【发布时间】:2018-07-31 08:50:56 【问题描述】:

我正在使用 FileManager 在我的应用程序中编辑、移动和删除文件。但是如何确定方法 moveItem 已完成?有没有可能的回调?我读了一些关于 FileManagerDelegate 的东西,但我没有找到足够的信息来使用它。 谢谢

【问题讨论】:

【参考方案1】:

moveItem(at:to:) 方法是同步的,这意味着在操作完成之前它不会继续执行任何代码行。在 Swift 中,它也是 throws,所以如果它给你一个错误,你就知道出了问题,如果它继续前进,一切都很好。你应该这样称呼它:

do
    try FileManager.default.moveItem(at: origURL, to: newURL)

catch let error
    // Handle any errors here
    dump(error)

在 Objective-C 中,它返回一个 BOOL 指定操作是否成功,并采用传递引用 NSError 如果出现问题,它将进行配置。例如:

NSError *error = nil;
BOOL success = [[NSFileManager defaultManager] moveItemAtURL:origURL toURL:newURL error:&error];
if(!success || error)
    // Something went wrong, handle the error here

else
    // Everything succeeded

【讨论】:

它是同步的,但您仍然可以将工作分派到另一个队列并将完成分派回主队列。检查我的答案。 你可以这样做,但如果你只是在呼叫站点处理队列和之后的任何代码,最终它会更容易/更清晰/更可配置的 imo 我想说的是这种工作不属于主线程(在我的选择中)。在哪里处理队列取决于开发人员。【参考方案2】:

您可以扩展您的 FileManager 以添加一些方法以更方便:

extension FileManager 
    func moveItem(at url: URL, toUrl: URL, completion: @escaping (Bool, Error?) -> ()) 
        DispatchQueue.global(qos: .utility).async 

            do 
                try self.moveItem(at: url, to: toUrl)
             catch 
                // Pass false and error to completion when fails
                DispatchQueue.main.async 
                   completion(false, error)
                
            

            // Pass true to completion when succeeds
            DispatchQueue.main.async 
                completion(true, nil)
            
        
    

然后这样称呼它:

FileManager.default.moveItem(at: atUrl, toUrl: toUrl)  (succeeded, error) in
    if succeeded 
        // Success
     else 
        // Something went wrong
    

【讨论】:

以上是关于FileManager MoveItem 回调 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

请问fckeditor的filemanager(java)中,上传完文件后怎么返回文件名到页面上去啊?

无法使用回调方法更改 ASPxFileManager 控件的 RootFolder

VueJS 不会从组件中重新渲染列表

FileManager.urls 返回错误

fileManager.createFileAtPath 在单元测试期间失败

FileManager 会抛出啥错误?