Estoy tratando de diseñar un método auxiliar que recupere un UIManagedDocument, luego lo abra y lo devuelva, para que pueda acceder al mismo UIManagedDocument desde varios lugares en mi aplicación.¿Cómo creo una instancia global de UIManagedDocument por documento en disco compartida por toda mi aplicación usando bloques?
Tengo problemas con la naturaleza asíncrona de esto ya que no estoy muy familiarizado con los bloques. Lo ideal sería que la secuencia de eventos sería la siguiente:
- Clase X llama al método de ayuda para recuperar el UIManagedDocument e incluye un bloque de código a ejecutar cuando se devuelve el documento abierto.
- El método de clase recupera el UIManagedDocument y llama a openWithCompletionHandler o saveToURL según sea necesario, e incluye un bloque de código para ejecutar cuando se devuelve el documento abierto.
- openwithCompletionHandler o saveToURL completar su tarea, y regresar con éxito = SI y ejecutar el código en su bloque
- El método de la clase completa su tarea y regresa con un UIManagedDocument abierta y ejecuta el código en su bloque
¿Puedo pasar el bloque original de alguna manera?
Aquí está mi código hasta ahora. Cualquier pensamiento muy apreciado, gracias.
// This is a dictionary where the keys are "Vacations" and the objects are URLs to UIManagedDocuments
static NSMutableDictionary *managedDocumentDictionary = nil;
// This typedef has been defined in .h file:
// typedef void (^completion_block_t)(UIManagedDocument *vacation);
// The idea is that this class method will run the block when its UIManagedObject has opened
@implementation MyVacationsHelper
+ (void)openVacation:(NSString *)vacationName usingBlock:(completion_block_t)completionBlock
{
// Try to retrieve the relevant UIManagedDocument from managedDocumentDictionary
UIManagedDocument *doc = [managedDocumentDictionary objectForKey:vacationName];
// Get URL for this vacation -> "<Documents Directory>/<vacationName>"
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:vacationName];
// If UIManagedObject was not retrieved, create it
if (!doc) {
// Create UIManagedDocument with this URL
doc = [[UIManagedDocument alloc] initWithFileURL:url];
// Add to managedDocumentDictionary
[managedDocumentDictionary setObject:doc forKey:vacationName];
}
// If document exists on disk...
if ([[NSFileManager defaultManager] fileExistsAtPath:[url path]])
{
[doc openWithCompletionHandler:^(BOOL success)
{
// Can I call the completionBlock from above in here?
// How do I pass back the opened UIDocument
}];
} else {
[doc saveToURL:url
forSaveOperation:UIDocumentSaveForCreating
completionHandler:^(BOOL success)
{
// As per comments above
}];
}
}
la rompió fuera del parque, buen trabajo, funciona como un sueño! – Alan