recycleURL:completionHandler: with NIL 使其阻塞直到完成



我正在将文件发送到垃圾箱

[NSWorkSpace recycleURLs: myArrayOfOneNsurl
             completionHandler: NIL]

myArrayOfOneNsurl 是使用单个NSURL arrayWithObject:创建的NSArray,该是为具有 fileURLWithPath:isDirectory: 的绝对文件路径创建的。

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

没有这个回调,有什么办法可以检查成功吗?目前我在调用这个后设置了一个循环,以检查文件是否存在,如果 1 秒过去并且仍然存在,我声明失败。我想知道我是否将NIL设置为第二个参数以recycleURLs:completionHandler:它是否会阻止直到该过程完成(无论是否成功)?在我的测试中,第一次检查总是发现文件不再位于其原始位置(意味着它已被丢弃),但我不确定我的计算机是否只是超快,或者它真的阻塞直到文件操作完成。

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

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

此 API 是异步的。将NULL作为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);

最新更新