Alamorefile время загрузки изображений при использовании многих потоков - PullRequest
0 голосов
/ 09 октября 2019

Я использую мойю для загрузки многих изображений с помощью OperationQueue для управления maxConcurrentOperationCount. Предположим, у меня есть 100 изображений, загружая 5 изображений каждый раз. Тайм-аут Alamorefire устанавливается на 10 секунд.

Загрузка одного изображения происходит очень быстро, тайм-аут запускается. Но когда я загружаю 100 изображений, используя метод ниже, даже используя многопоточность, это вызывает тайм-аут. Почему? Спасибо!

queue = OperationQueue()
            queue.maxConcurrentOperationCount = 5
            var i = 0
            for image in photos {
                autoreleasepool {
                    let operation:BlockOperation = BlockOperation(block: {
                        [weak self] in
                        guard let strongSelf = self else {return}
                        print("hyl cur thread %@", Thread.current)
                        strongSelf.uploadImage(image)
                        return
                    })
                    i += 1
                    queue.addOperation(operation)
                }
            }
private func uploadImage(_ image: UIImage) {
        AladdinProvider.rx.request(.upload(access_token: UserInfo.instance.access_token!, file_name: "file_name", data: image)).asObservable().mapJSON().mapObject(type: AlbumDatas.self).subscribe(onNext: {
            [weak self] result in
            guard let strongSelf = self else {return}
            // TODO success

            }, onError: {
                 error in
                print(\(error))

        }).disposed(by: disposeBag)
    }

1 Ответ

0 голосов
/ 09 октября 2019

По сути, это проблема с созданием и возобновлением URLSessionTask с до того, как им разрешат работать. Это усугубляется Alamofire, который создает URLSessionTask сразу после создания соответствующего значения *Request. Может помочь увеличение времени ожидания для URLRequest, которые вы используете для загрузки изображений. Более тщательным решением было бы немедленно прекратить создание запросов Alamofire, а не создавать их только после завершения нескольких первых запросов. Это должно предотвратить тайм-аут связанных задач.

...