Swift iOS -UrlSession движется очень медленно.Есть ли способ сделать несколько задач одновременно? - PullRequest
0 голосов
/ 21 мая 2018

У меня есть массив 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()
        }
    }
}

1 Ответ

0 голосов
/ 14 августа 2018

Есть ли способ, как я могу выполнить несколько UrlSessions одновременно, вместо того, чтобы проходить через них?

Как раз наоборот.Для оптимальной скорости вы хотите один URLSession, который вы настраиваете и сохраняете (т.е. не общий сеанс), который используется для всех ваших различных задач.Сеанс сможет запланировать это и сократить ваши задержки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...