Я обновляю базу данных пользователей из списка инструкций.Если есть новые фотографии для загрузки, я вызываю отдельную функцию и отправляю запрос URL для каждой фотографии, затем хочу использовать завершение, чтобы сообщить вызывающей функции, что все фотографии были загружены.Я вызываю эту функцию с новым NSManagedObjectContext через coreDataStack.storeContainer.performBackgroundTask.
Я использую цикл for для итерации по URL-адресам и думал, что использование DispatchGroup обеспечит успешную загрузку всех фотографий перед вызовом завершения.
Я использовал wait (timeout :) с 30-секундным таймаутом.Я могу успешно войти в функцию для запроса отдельной фотографии, но URLSession.shared.datatask возобновляется только при истечении времени ожидания!
Я явно что-то не так делаю с DispatchGroup, но я использовал его в другом местеи не вижу, в чем проблема: /
func updatePhotoOrImage(moContext: NSManagedObjectContext, idsNeedingPhotoOrImageUpdate: [(Int, Bool)], completion: @escaping (_ success: Bool) -> Void) {
let downloadGroup = DispatchGroup()
for (onlineID, isPerson) in idsNeedingPhotoOrImageUpdate {
if isPerson {
let personFromID = AdministrativeHelperFunctions.findPersonFromOnlineID(onlineID: onlineID, moContext: moContext)
if let personFromID = personFromID {
if let urlString = personFromID.urlString {
downloadGroup.enter()
NetworkHelperFunctions.retrieveAndSavePhotoFromOnline(urlString: urlString, moContext: moContext, person: personFromID) { _ in
downloadGroup.leave()
}
}
}
} else {
let bookEntryFromID = AdministrativeHelperFunctions.findbookEntryFromOnlineID(onlineID: onlineID, moContext: moContext)
if let bookEntryFromID = bookEntryFromID {
if let urlString = bookEntryFromID.imageURLString {
downloadGroup.enter()
BookNetworkFunctions.retrieveAndSaveImageFromOnline(urlString: urlString, moContext: moContext, bookEntry: bookEntryFromID) { _ in
downloadGroup.leave()
}
}
}
}
}
let result = downloadGroup.wait(timeout: .now() + 30)
if result == .timedOut {
print("TimedOut")
}
completion(true)
}
public class func retrieveAndSavePhotoFromOnline(urlString: String, moContext: NSManagedObjectContext, person: Person, completion: @escaping (Bool) -> Void) {
let photoURL = URL(string: urlString)
if let photoURL = photoURL {
let task = URLSession.shared.dataTask(with: photoURL) { (data, response, error) in
if let data = data {
person.photoData = data as NSData
completion(true)
} else {
completion(false)
}
}
}
task.resume()
} else {
completion(false)
}
}
В основном я хочу сохранить контекст, как только все фотографии будут возвращены.На самом деле время ожидания истекает, контекст сохраняется (для других вещей во вложенных функциях), а затем URLSession немедленно запускается и возвращает фотографию!
Любая помощь будет принята с благодарностью.