DownloadGroup неожиданно блокирует сетевой вызов - PullRequest
0 голосов
/ 18 апреля 2019

Я обновляю базу данных пользователей из списка инструкций.Если есть новые фотографии для загрузки, я вызываю отдельную функцию и отправляю запрос 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 немедленно запускается и возвращает фотографию!

Любая помощь будет принята с благодарностью.

...