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