Задача, созданная в сеансе, который был признан недействительным - PullRequest
2 голосов
/ 11 марта 2020

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

Fatal Exception: NSGenericException
Task created in a session that has been invalidated

в следующей строке

NSURLSessionTask *task = [self.session uploadTaskWithRequest:request fromFile:filePathURL];
[task resume];
[self.session finishTasksAndInvalidate];

Я обработал недействительность сеанса на метод делегата

- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(NSError *)error {
    // Crashlytics logging
    [CrashlyticsKit setBoolValue:true forKey:@"URLSession_didBecomeInvalid"];
    self.session = [self createNewSession];
}

- (NSURLSession *)CreateSession {
    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:SERVER_URL];

    if (@available(iOS 11.0, *)) {
        sessionConfig.waitsForConnectivity = YES;
    }
    return [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
}

после загрузки новой сборки у меня все тот же cra sh и никаких журналов Crashlytics на "didBecomeInvalidWithError" вообще!

есть идеи как решить это cra sh?

1 Ответ

0 голосов
/ 12 марта 2020

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

Это дает вам два варианта:

  • Если вам необходимо сделать недействительным сеанс, я бы рекомендовал установить для вашей ссылки session значение nil, чтобы вы могли ' т случайно использовать его снова. Если вам потребуется выполнить еще один запрос позже, вы должны создать новый объект сеанса.

  • Если вам когда-нибудь понадобится снова использовать сеанс, вы можете просто воздержаться от его аннулирования. Влияние памяти на хранение одного объекта сеанса в значительной степени несущественно. Это действительно проблема, если вы создаете много сеансов.

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

...