software restaurarse restaurar pudo producido problema podido para ocurrio ocurrido error desconocido descargar celular apple actualizacion iphone core-data ios-4.2 nsfilemanager

restaurarse - ha ocurrido un problema al descargar el software para el iphone



replaceItemAtURL falla sin error en iOS pero funciona bien en OSX (2)

Estoy implementando un proceso de migración desencadenado manualmente para una aplicación basada en CoreData, y después de que la migración se complete con éxito, estoy tratando de mover la base de datos migrada a la parte superior de la original utilizando replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:

El problema es que en iOS, nada de lo que haga hará que este método vuelva a SÍ, sin embargo, nunca coloca nada en el puntero de error para permitirle ver qué está mal.

Leí cosas en otra parte (por ejemplo, http://www.cocoabuilder.com/archive/cocoa/287790-nsdoc-magic-file-watcher-ruins-core-data-migration.html ) indicando que no se están cerrando todos los CoreData Los objetos (por ejemplo, NSMigrationManager, NSManagedObjectModel, etc.) antes de intentar la sustitución pueden ser la causa, pero no fue así. Incluso implementé un pequeño archivo de creación e intercambio de dos cosas que no involucraba CoreData DBs en absoluto para verificar que las cosas de CoreData no tuvieran nada que ver con eso.

Luego noté en la documentación oficial que se supone que el newitemURL está en un directorio que se considera apropiado para los archivos temporales. Supuse que eso significaba un directorio devuelto por URLForDirectory:inDomain:appropriateForURL:create:error: utilizando NSItemReplacementDirectory como la ruta de búsqueda.

¡Eso tampoco funcionó! Terminé recurriendo a la implementación de la lógica de reemplazo mediante operaciones separadas, pero esto no es atómico e inseguro y todo eso es malo.

¿Alguien tiene un fragmento de código de trabajo que se ejecuta en iOS que devuelve SÍ de una llamada a replaceItemAtURL o en realidad coloca información de error en el puntero de error?

Cualquier ayuda muy apreciada.

EDITAR - Código de prueba incluido a continuación. Esto se ejecuta en la application:didFinishLaunchingWithOptions: en el hilo principal.

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


En el sistema de archivos mac no se distingue entre mayúsculas y minúsculas, sino en IOS. Aunque no puede tener dos archivos con el mismo nombre pero con un caso diferente en una ubicación, la ruta distingue entre mayúsculas y minúsculas. Entonces, si el archivo tiene .JPEG y en su código está pasando el enlace con .jpeg, fallará. Puede que no sea el caso con usted, sino simplemente qué compartir

Aunque extrañamente debería darte un error.


He experimentado problemas con todos los métodos de NSFileManager usando una URL en iOS. Sin embargo, todos los métodos que usan Path funcionan. Así que creo que deberías usar removeItemAtPath:error: y copyItemAtPath:toURL:error: para ese propósito.

Espero eso ayude