【问题标题】:replaceItemAtURL fails without error on iOS but works fine on OSXreplaceItemAtURL 在 iOS 上没有错误但在 OSX 上工作正常
【发布时间】:2011-06-21 10:34:20
【问题描述】:

我正在为基于 CoreData 的应用程序实施手动触发的迁移过程,并且在迁移成功完成后,我正在尝试使用 replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error: 将迁移的数据库移回原始数据库的顶部。

问题在于,在 iOS 上,我所做的任何事情都不会让这个方法返回 YES,但它也不会在错误指针中放入任何内容以让您查看发生了什么问题。

我在其他地方读过一些东西(例如http://www.cocoabuilder.com/archive/cocoa/287790-nsdoc-magic-file-watcher-ruins-core-data-migration.html),表明在尝试替换之前没有关闭所有 CoreData 对象(例如 NSMigrationManager、NSManagedObjectModel 等)可能是原因,但事实并非如此。我什至实现了一点不涉及 CoreData DB 的两个文件创建和交换的东西,以验证 CoreData 的东西与它没有任何关系。

然后我在official documentation 中注意到newitemURL 应该位于被认为适合临时文件的目录中。我假设这意味着URLForDirectory:inDomain:appropriateForURL:create:error: 返回的目录使用NSItemReplacementDirectory 作为搜索路径。

那也没用!我最终退回到使用单独的操作来实现替换逻辑,但这是非原子的、不安全的以及所有这些坏东西。

有没有人有一个在 iOS 上运行的有效的 sn-p 代码,它要么从对 replaceItemAtURL 的调用中返回 YES,要么实际上将错误信息放入错误指针中?

非常感谢任何帮助。

编辑 - 下面包含测试代码。这在主线程的application:didFinishLaunchingWithOptions: 中运行。

NSFileManager *fm = [[NSFileManager alloc] init];
NSError *err = nil;
NSURL *docDir = [NSURL fileURLWithPath:[self applicationDocumentsDirectory]];

NSURL *tmpDir = [fm URLForDirectory:NSItemReplacementDirectory
                           inDomain:NSUserDomainMask
                  appropriateForURL:docDir
                             create:NO
                              error:&err];

NSURL *u1 = [docDir URLByAppendingPathComponent:@"f1"];
NSURL *u2 = [tmpDir URLByAppendingPathComponent:@"f2"];
NSURL *repl = nil;

[fm createFileAtPath:[u1 path]
            contents:[[NSString stringWithString:@"Hello"]
                      dataUsingEncoding:NSUTF8StringEncoding]
          attributes:nil];

[fm createFileAtPath:[u2 path]
            contents:[[NSString stringWithString:@"World"]        
                      dataUsingEncoding:NSUTF8StringEncoding]
          attributes:nil];

BOOL test = [fm replaceItemAtURL:u1 withItemAtURL:u2 backupItemName:@"f1backup"
                         options:0 resultingItemURL:&repl error:&err];

// At this point GDB shows test to be NO but error is still nil

【问题讨论】:

  • 已在 Jonathan 上方添加代码 - 任何输入表示赞赏。
  • 我遇到了同样的问题。我尝试将 newItemURL 指向的创建文件放在与NSTemporaryDirectory()NSCachesDirectory 对应的目录中,但它仍然失败而没有任何错误。你有运气吗?
  • 很遗憾没有。我最终只是通过自己实现它来解决它,这真的很糟糕。
  • resultingItemURL 真的可以为零吗?文档中没有这样说。
  • 我在 iOS 6 上运行了这段代码,它可以工作(返回 YES)。所以这可能是自 iOS 4 以来已解决的错误。

标签: iphone core-data ios-4.2 nsfilemanager


【解决方案1】:

我在 iOS 上使用 URL 的所有 NSFileManager 方法都遇到了问题。但是,所有使用 Path 的方法都有效。所以我认为你应该为此使用removeItemAtPath:error:copyItemAtPath:toURL:error:

希望对你有帮助

【讨论】:

    【解决方案2】:

    在mac 文件系统中不区分大小写,但在IOS 中。即使您不能在一个位置有两个具有相同名称但大小写不同的文件,路径也是区分大小写的。因此,如果文件具有 .JPEG 并且在您的代码中您正在传递带有 .jpeg 的链接,它将失败。 你可能不是这样,只是分享什么

    虽然奇怪的是它应该给你错误。

    【讨论】:

      猜你喜欢
      • 2018-08-01
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多