Renvoyer l'object de la méthode du bloc interne

Je me request comment faire correctement ce qui suit: J'ai une méthode qui consiste à returnner un object NSData . Il obtient l'object NSData d'un UIDocument . L'object NSData peut devenir volumineux, donc je veux m'assurer qu'il est complètement chargé avant que la réponse ne commence. Je voudrais donc returnner la valeur de la méthode à l'intérieur même du bloc. Donc, quelque chose comme ça:

 - (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 } }]; } 

Cela provoque une erreur car le return fait apparemment reference au return du block .

Comment puis-je accomplir cela sans avoir à faire un thread bloquant l'attente / while loop?

Merci.

Tu ne peux pas. Emarmsez le fait que ce que vous essayez de faire est asynchronous et ajoutez un paramètre de bloc d'achèvement à votre méthode getMyData qui est appelée lorsque le gestionnaire d'achèvement interne est appelé. (Et supprimer le return de la signature de la méthode):

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

Le même problème existe dans swift et vous pouvez append un bloc d'achèvement similaire:

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

La méthode ouverte est asynchronous, c'est pourquoi vous devez fournir un bloc à exécuter lorsque l'ouverture est terminée. Vous devez copyr ceci et faire en sorte que votre méthode reçoive également un bloc de code que vous exécuterez à la fin de l'ouverture.

Vous devez également passer à travers l'argument de succès de l'appel que vous encapsulez ou créer une erreur, vous devez faire cela pour que le code appelant puisse prendre la bonne action.

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

Voici la méthode comment déclarer la méthode avec completionHandler:

Objectif c

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

Swift-3

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