Devolviendo el object del método desde el interior del bloque

Me pregunto cómo hacer lo siguiente correctamente: tengo un método que es devolver un object NSData . Obtiene el object NSData de un documento UIDocument . El object NSData puede ser grande, así que quiero asegurarme de que esté completamente cargado antes de que comience la respuesta. Por lo tanto, me gustaría devolver el valor del método desde el propio bloque. Entonces algo como esto:

 - (NSData*)getMyData { MyUIDocument *doc = [[MyUIDocument alloc] initWithFileURL:fileURL]; [doc openWithCompletionHandler:^(BOOL success) { if (success) { return doc.myResponseData; // this is to be the return for the method not the block } }]; } 

Esto provoca un error porque el return aparentemente se refiere al return del block .

¿Cómo puedo lograr esto sin tener que hacer un locking de hilo esperar / mientras bucle?

Gracias.

No puedes Abraza el hecho de que lo que estás tratando de hacer es asíncrono y agrega un parámetro de bloque de finalización al método getMyData que se llama cuando se llama al controller de finalización interno. (Y elimine el return de la firma del método):

 - (void)getMyDataWithCompletion:(void(^)(NSData *data))completion { MyUIDocument *doc = [[MyUIDocument alloc] initWithFileURL:fileURL]; [doc openWithCompletionHandler:^(BOOL success) { completion((success ? doc.myResponseData : nil)); }]; } 

El mismo problema existe en swift y puede agregar un bloque de finalización similar:

 func getMyData(completion: ((data: NSData?) -> Void) { data = ... completion(data) } 

El método abierto es asíncrono, por lo que debe proporcionar un bloque para ejecutarlo cuando se complete la apertura. Debe copyr esto y hacer que su método también reciba un bloque de código que ejecutará cuando finalice la apertura.

También debe pasar el argumento de éxito de la llamada que está envolviendo o crear un error, debe hacer esto para que el código de llamada pueda tomar la acción correcta.

 - (void)getMyDataWithCompletion:(void(^)(NSData *data, BOOL success))completion { MyUIDocument *doc = [[MyUIDocument alloc] initWithFileURL:fileURL]; [doc openWithCompletionHandler:^(BOOL success) { completion(doc.myResponseData, success); }]; } 

Los siguientes son el método de declarar el método con completionHandler:

C objective

 - (void)getMyDataWithCompletionHandler:(void(^)(NSString *str))completionHandler { completionHandler(@"Test"); } 

Swift-3

 func showDatePicker(superc: UIViewController, completionHandler:@escaping (String) -> Void) { completionHandler("Test") }