IOS / Objective-c: возвращаемое значение из блока завершения или закрытия асинхронно к вызывающей функции - PullRequest
0 голосов
/ 22 сентября 2018

Из-за асинхронного характера замыканий или блоков завершения я понимаю, что невозможно «вернуть» значение непосредственно из одного.Однако в моем пользовательском интерфейсе для приложения чата это приемлемо - и фактически необходимо дождаться ответа.Поэтому мой вопрос заключается в том, каков наилучший способ приостановить любое действие, пока у вас не будет ответа, и, во-вторых, вернуть ответ вызывающему методу.

Это то, что я хотел бы сделать, чего я не делаю 'Не думаю, что вы можете сделать ...

(NSString*) getStringFromRemoteResource {

    [self goGetString:^(NSString *string,NSError *error){
   NSLog(@"retrieved string is%@",string);
        return string;//NOT ALLOWED
    }];
}

// С другой стороны, вы можете сделать это, когда возврат недействителен

(void) getStringFromRemoteResource {

    [self goGetString:^(NSString *string,NSError *error){
   NSLog(@"string is%@",string);
        [self doSomethingWithString];
    }];
}

В моем коде менеджер, который вызываетМетод выше должен вернуть значение.

        (NSString*) chatManager {
        [self getStringFromRemoteResource];
//do other stuff
    return string;
        }

Так что мой вопрос после вызова getStringFromRemoteResource как мне вернуть результат в manageChat, чтобы вернуть его в пользовательский интерфейс.Или как выглядит SomethingWithString?Я не хочу кардинально менять chatManager, так как он делает кучу других вещей.

Заранее благодарен за любые предложения

1 Ответ

0 голосов
/ 22 сентября 2018

В ходе любого асинхронного вызова у вас не может быть метода в иерархии, который бы возвращал значение напрямую, если только вы не заблокируете этот поток, но вам нужно

-(void)chatManager:(void (^)(NSString*))completed {

    [self getStringFromRemoteResource:^(NSString *str) {
        completed(str);
    }];
}

-(void)getStringFromRemoteResource:(void (^)(NSString*))comp{

    [self goGetString:^(NSString *string,NSError *error){
        comp(string);
    }];
}

ИЛИ

-(void)chatManager:(void (^)(NSString*))completed {

    [self goGetString:^(NSString *string,NSError *error){
        completed(string);
    }];
}

здесь chatManager является только оберткой для организации причин, которые позволяют вам иметь доступ к его методам где угодно, а не дублировать их везде, но у него должна быть эта структура

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...