2012-02-09 5 views
11

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:

  1. 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.
  2. 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.
  3. openwithCompletionHandler o saveToURL completar su tarea, y regresar con éxito = SI y ejecutar el código en su bloque
  4. 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 
     }]; 

    } 

} 

Respuesta

7

Puede ejecutar el bloque con completionBlock (doc).

[doc openWithCompletionHandler:^(BOOL success) 
    { 
     // Can I call the completionBlock from above in here? 
     // How do I pass back the opened UIDocument 
     completionBlock(doc); 
    }]; 

Vamos a suponer que usted tiene el siguiente método implementado en la clase que va a llamar a su método de openVacation:

-(void)vacationOpened:(UIManagedDocument *)vacation 
{ 
    NSLog(@"My Vacation: %@", vacation.description); 
} 

Una línea de ejemplo de código que llame a su método de openVacation sería:

El (UIManagedDocument * vacaciones) después del símbolo de intercalación significa que cuando ejecuta el bloque usando la notación de paréntesis - como en completionBlock (doc) -, debe enumerar un (UIManagedDocument *) como parámetro. El valor de ese parámetro se denominará vacaciones dentro del bloque especificado. Lo que hice en mi ejemplo de código de bloque anterior fue llamar a un método en mi clase actual (self) y pasar el parámetro a ese método para poder usarlo según sea necesario (acabo de hacer un NSLog aquí para asegurarme de que funcionó) .

+0

la rompió fuera del parque, buen trabajo, funciona como un sueño! – Alan

Cuestiones relacionadas