@GeneCode - Это немного превысило лимит комментариев ;-)
у вернуться из внешней функции изнутри асинхронной внутренней функции. В быстром я бы использовал обработчик завершения для этой цели, который будет выходить из функции. Но в цели c обработчик завершения на самом деле не вернется из функции:
Моя функция выглядит так:
-(void)chosenFrom:(NSDictionary<NSString *,id> *)info{
[self asyncCode:info withCompletion:^(NSData *imageData) {
if(imageData) {
// I want to return from chosenFrom function ***inside here.***
}
}];
// This is to illustrate completion handler don't escape
[self checkCompletionEscaping:^(NSString * lad) {
NSLog(@"Check me %@", lad);// It would print all 3 lines below.
}];
}
-(void) checkCompletionEscaping:(void(^)(NSString * lad)) completion {
completion(@"Hello"); // completion handler should've escaped from func.
completion(@"Shivam");
completion(@"How are you");
}
Если бы я использовал swift, я мог бы легко вернуться из внешней функции изнутри внутренней функции, используя обработчик завершения:
private func getHistoryKeys(searchterm: String, completion: @escaping () -> ()) {
let url = PubmedAPI.createEsearchURL(searchString: searchterm)
let task = session.dataTask(with: url) { (data, response, error) in
if let error = error {
completion() // This would work as return
} else {
completion() // Same as return
}
}
task.resume()
}
PS: экранирование означает возврат из функции так же, как оператор return.