@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.

Ответы на вопрос(2)

Ваш ответ на вопрос