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")
}