У меня есть массив URL-адресов, в массиве может быть от 1 до 6 изображений, и не более того.
Используемый мною цикл работает сейчас, но UrlSession движется смехотворно медленно.Загрузка 6 изображений в Firebase занимает почти 1-2 минуты.Я попробовал это с запуском XCode, но без XCode и независимо от того, что он движется очень медленно.Моя сеть очень быстрая, поэтому дело не в этом.
Я прочитал несколько сообщений SO, в которых говорится, что ключ заключается в том, что в конец очереди помещается completeHandler, что я и не пытался.
Есть ли способ, как я могу выполнить несколько UrlSessions одновременно, вместо того, чтобы проходить через них?
Это работает, но движется медленно.post и думает объединить его с оператором switch, так как может быть только 1-6 URL, но я не могу найти способ узнать, когда все они закончены, чтобы я мог запустить свою secondWhenLoopIsFinishedSendDictToFirebaseDatabase()
функцию
fileprivate func multipleUsrlTaskSessionsAtOnce(){
switch userComplaintImageUrls.count {
case 0:
let urlZero = userComplaintImageUrls[0]
TaskManager.shared.dataTask(with: url) { (data, response, error) in
// how to know when all of them are completed?
}
break
case 1:
let urlOne = userComplaintImageUrls[1]
TaskManager.shared.dataTask(with: urlOne ) { (data, response, error) in
// how to know when all of them are completed?
}
break
case 2:
let urlTwo = userComplaintImageUrls[2]
TaskManager.shared.dataTask(with: urlTwo) { (data, response, error) in
// how to know when all of them are completed?
}
break
case 3:
let urlThree = userComplaintImageUrls[3]
TaskManager.shared.dataTask(with: urlThree) { (data, response, error) in
// how to know when all of them are completed?
}
break
case 4:
let urlFour = userComplaintImageUrls[4]
TaskManager.shared.dataTask(with: urlFour) { (data, response, error) in
// how to know when all of them are completed?
}
break
case 0:
let urlFive = userComplaintImageUrls[5]
TaskManager.shared.dataTask(with: urlFive) { (data, response, error) in
// how to know when all of them are completed?
}
break
default:
break
}
}
TaskManager Class:
class TaskManager {
static let shared = TaskManager()
let session = URLSession(configuration: .default)
typealias completionHandler = (Data?, URLResponse?, Error?) -> Void
var tasks = [URL: [completionHandler]]()
func dataTask(with url: URL, completion: @escaping completionHandler) {
if tasks.keys.contains(url) {
tasks[url]?.append(completion)
} else {
tasks[url] = [completion]
let _ = session.dataTask(with: url, completionHandler: { [weak self] (data, response, error) in
DispatchQueue.main.async {
print("Finished network task")
guard let completionHandlers = self?.tasks[url] else { return }
for handler in completionHandlers {
print("Executing completion block")
handler(data, response, error)
}
}
}).resume()
}
}
}