Выдача исключения при закрытии performbackgroundtask

Есть функция, я сохраняю данные из веб-ответа в свою базу данных, используя Cora Data. Функция должна генерировать исключение DataError, если некоторые данные отсутствуют, пустые или нулевые и т. д. Операции с базой данных должны выполняться в фоновой задаче с privateQueueContext. Перед сохранением данных в базе я проверяю, существует ли она уже (через fetchRequest). Если результат пуст, я начинаю обрабатывать данные и сохранять их в базе данных.

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

Вот метод:

private func processLittleItems(informationsFromWebServiceResponse : GetInformationsFromWebServiceResponse) throws {
    guard let littleItemListDataFromResponse = informationsFromWebServiceResponse.littleItemList else {
        throw DataError.dataMissing("littleItemList")
    }
    CoreDataStack.shared.persistentStoreContainer.performBackgroundTask { privateQueueContext in
        for littleItem in littleItemListDataFromResponse {
            let littleItemRequest = LittleItem.fetchRequest() as NSFetchRequest<LittleItem>
            littleItemRequest.predicate = NSPredicate(format: "id = %@", littleItem.iD!)
            littleItemRequest.fetchLimit = 1

            do {
                let littleItemlist = try privateQueueContext.fetch(littleItemRequest)
                if (littleItemlist.isEmpty) {
                    let newLittleItem = LittleItem(context: privateQueueContext)
                    guard let littleItemId = littleItem.iD else {
                        return  // HERE SHOULD BE THROW EXCEPTION, NOT JUST A RETURN
                    }
                    newLittleItem.id = littleItemId

                    newLittleItem.optionalThing = littleItem.optionalThing ?? false
                }
            } catch let error as NSError {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        }
        do {
            try privateQueueContext.save()
        } catch let error as NSError {
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    }
}

Не могли бы вы с этим помочь?

Заранее благодарим вас за любую помощь, которую вы можете оказать.

0
0
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

К сожалению, это не так просто. Если вызывающий processLittleItems ожидает исключения (или возвращаемого значения) от функции, он должен дождаться, пока все не будет сохранено. Следовательно, асинхронная обработка в этом случае работать не будет. Поэтому вам нужно переосмыслить, как в вашем приложении будет выполняться обработка ошибок:

  • Либо вызывающему processLittleItems нужно подождать, поэтому вам нужно удалить фоновое задание и все делать синхронно.
  • Или вызывающий не должен ждать (потому что это заблокирует поток пользовательского интерфейса). В этом случае вызывающий может предоставить обработчик завершения, который вы затем должны будете изнутри фонового закрытия и передать код ошибки / успеха.

Большое спасибо, чем я еще обдумываю эту функцию!

los.adrian 26.10.2018 11:44

Андреас Этьен прав в этом. вы выбрасываете в основном исключения для методов синхронизации, а не для асинхронных методов.

Один из вариантов - определить собственный обработчик завершения или обратный вызов в зависимости от вашей логики и использовать его для отправки ошибки обратно и использования ее при необходимости. образец:

private func processLittleItems(informationsFromWebServiceResponse : GetInformationsFromWebServiceResponse, completion: (_ error: Error?, object: Any?) -> Void)

и когда возникает исключение. completion('your exception', nil)

Надеюсь, это поможет.

Большое спасибо, чем я еще обдумываю эту функцию!

los.adrian 26.10.2018 11:44

Другие вопросы по теме