Синхронные вызовы NSURLSession - PullRequest
0 голосов
/ 21 июня 2020

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

- (void)codePathWithURL:(NSURLRequest *)request {
    // Create session
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    config.URLCache = nil;
    config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
    
    NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:config delegate:nil delegateQueue:nil];


    // Using semaphores
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    NSURLSessionDataTask *sessionTask = [urlSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        responseData = data;
        httpResponse = (NSHTTPURLResponse *)response;
        outError = error;
        
        dispatch_semaphore_signal(semaphore);
    }];
    [sessionTask resume];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    // do something with data 
}

Проблема, которую я вижу здесь, - это блокировка основного потока. Как мне сделать так, чтобы основной поток не блокировался?

1 Ответ

0 голосов
/ 21 июня 2020

Просто быстрая и грязная попытка помочь вам начать работу ... может быть, использовать условие?

// Call this on the background NOT on the main thread
- ( ... ) some message
{
    // Added stuff
    __block BOOL done = NO;      // ... use now to set data as well
    __block NSString * data;     // ... or whatever is needed
    NSCondition * condition = NSCondition.new;

    // Your original stuff
    // Create session
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    config.URLCache = nil;
    config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
    
    NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:config delegate:nil delegateQueue:nil];
 NSURLSessionDataTask *sessionTask = [urlSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        responseData = data;
        httpResponse = (NSHTTPURLResponse *)response;
        outError = error;

        // Added stuff
        condition.lock;
        done = YES;

        // Set data
        data = ... something ...        

        condition.broadcast;
        condition.unlock;
    }];

    [sessionTask resume];

    // New stuff
    condition.lock;
    while ( ! done )
    {
      condition.wait;
    }
    condition.unlock;

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