recycleURLs:completionHandler:使用NIL使其阻塞直到完成?

时间:2016-02-29 08:10:50

标签: objective-c

我正在使用

将文件发送到垃圾箱
[NSWorkSpace recycleURLs: myArrayOfOneNsurl
             completionHandler: NIL]

myArrayOfOneNsurl是使用NSArray创建的arrayWithObject: NSURLfileURLWithPath:isDirectory:的绝对文件路径创建的。{/ p>

判断它是否成功的正常方法是使用completionHandler,然后检查第二个arg(NSError)是否为NIL,这意味着成功。

无论如何没有这个回调来检查成功吗?目前我在调用它之后设置了一个循环,检查文件是否存在,如果1秒已经过去且它仍然存在,我声明失败。我想知道我是否将NIL作为第二个arg设置为recycleURLs:completionHandler:它是否阻止该过程完成(无论成功与否)?在我的测试中,第一次检查总是发现文件不再位于其原始位置(意味着它已被删除),但我不确定我的计算机是否超级快,或者它确实在文件操作完成之前阻塞

2 个答案:

答案 0 :(得分:2)

要废弃单个文件或目录,您可以改用NSFileManager trashItemAtURL。它是同步的,因此您可以通过完成回调来避免麻烦。

NSError * error = nil;
[[NSFileManager defaultManager] trashItemAtURL:url resultingItemURL:nil error:&error];

答案 1 :(得分:1)

此API是异步的。将completionHandler作为completionHandler传递仅表示您对结果不感兴趣。了解操作何时完成并且成功的唯一方法是使用__block BOOL recycleFinished = NO; __block NSError *recycleError = nil; [[NSWorkspace sharedWorkspace] recycleURLs:myArrayOfOneNsurl completionHandler:^(NSDictionary<NSURL *,NSURL *> * _Nonnull newURLs, NSError * _Nullable error) { recycleFinished = YES; recycleError = error; }]; while (!recycleFinished) { [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:.5]]; } // access recycleError NSLog(@"%@", recycleError);

如果你真的需要让它同步,你可以使用以下方法(虽然我不建议这样做):

{{1}}