tesis sobre investigacion custom caracteristicas bar ios objective-c block uidocument completionhandler

ios - sobre - Objeto de método de devolución desde el interior del bloque



swift navigation bar (3)

El método abierto es asíncrono y es por eso que debe proporcionar un bloque para que se ejecute cuando se complete la apertura. Debe copiar 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 por 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); }]; }

Me pregunto cómo hacer lo siguiente correctamente: tengo un método que es devolver un objeto NSData . Obtiene el objeto NSData de un UIDocument . El objeto NSData puede NSData , por lo 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 causa un error porque el return aparentemente se refiere a la return del block .

¿Cómo puedo lograr esto sin tener que hacer un hilo que bloquee el ciclo wait / while?

Gracias.


No puedes. Acepte el hecho de que lo que está tratando de hacer es asincrónico y agregue un parámetro de bloque de finalización a su método getMyData , que se getMyData cuando se llama al controlador 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 breve y puede agregar un bloque de finalización similar:

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


A continuación se muestra el método de cómo declarar el método con completionHandler:

C objetivo

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

Swift-3

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