Вызов синхронизации синхронизации внутри асинхронной синхронизации в iOS - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь вызвать синхронизирующий вызов surlsession внутри асинхронного вызова surlsession, и он не работает.Синхронный вызов не завершен.ниже код.

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"URL1"]];
    [request setHTTPMethod:@"GET"];

    // Call first service
    [[NSURLSession.sharedSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        if(data){
            // If first webservice is successful then dont call second service
            return;
        }

        // Call second service
        NSMutableURLRequest *request2 = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"URL2"]];
        [request2 setHTTPMethod:@"GET"];

        dispatch_semaphore_t sem = dispatch_semaphore_create(0);

        [[NSURLSession.sharedSession dataTaskWithRequest:request2 completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

            dispatch_semaphore_signal(sem);

        }] resume];

        dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

    }] resume];

1 Ответ

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

как заметил @Larme, вероятно, лучше передать здесь блок завершения в ваш метод, а затем вызвать его в блоках завершения любого из запросов (похоже, вы хотите использовать данные из первого веб-сервиса, если он имеети затем второй, если нет):

- (void)webServiceRequestWithCompletion:(void (^_Nullable)(NSData *_Nullable completionData, NSError *_Nullable error))completionAfter {
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"URL1"]];
    [request setHTTPMethod:@"GET"];
    // Call first service
    [[NSURLSession.sharedSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (data) {
            // If first webservice is successful then dont call second service
            if (completionAfter) {
                completionAfter(data, error);
            }
            return;
        }
        // Call second service
        NSMutableURLRequest *request2 = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"URL2"]];
        [request2 setHTTPMethod:@"GET"];
        [[NSURLSession.sharedSession dataTaskWithRequest:request2 completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            if (completionAfter) {
                completionAfter(data, error);
            }
        }] resume];
    }] resume];
}

Тогда вы бы назвали это примерно так:

[self webServiceRequestWithCompletion:^(NSData *completionData, NSError *error) {
    // do stuff with data returned from one of the two webservices here
}];

Если это не то, что вы пытаетесь сделать,тогда вам нужно будет отредактировать свой вопрос и предоставить дополнительный контекст, как то, как этот код называется и почему вы должны использовать семафор (чего он ждет?)

Этот сайт полезен для понимания того, как использоватьСинтаксис блока: http://goshdarnblocksyntax.com

И здесь у Apple хорошая документация: https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html

...