загрузка нескольких изображений из каталога документов с использованием параллельной очереди, но пользовательский интерфейс все еще блокируется - PullRequest
0 голосов
/ 08 июля 2020

Я пытался загрузить 6 изображений в 6 изображений из каталога документов. Я использовал dispatchqueue

  let concurrentQueue = DispatchQueue(label: "myConcurrentQueue", qos: .background, attributes: [.concurrent,.initiallyInactive], autoreleaseFrequency: .inherit, target: nil)

Но даже если я использую параллельную очередь, пользовательский интерфейс все еще не отвечает, пользовательский интерфейс заблокирован

Я использовал код ниже

 private func loadImagesConCurrent() {
    let concurrentQueue = DispatchQueue(label: "myConcurrentQueue", qos: .background, attributes: [.concurrent,.initiallyInactive], autoreleaseFrequency: .inherit, target: nil)
    dispatchq = concurrentQueue
    activity.startAnimating()
    for i in 0..<myArray.count {
        concurrentQueue.async { [weak self] in
            do {
                let location = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
                let filename = URL(fileURLWithPath: location!).appendingPathComponent((self?.myArray[i]) as! String)
                     
                if let image = UIImage(contentsOfFile: filename.path) {
                      DispatchQueue.main.async {
                        self?.imagesCollection[i].image = image
                        print("loaded")
                        if i == (self?.myArray.count)! - 1 {
                            self?.activity.startAnimating()
                        }
                      }
                    }
            } catch {
                print(error.localizedDescription)
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Удалить ,.initiallyInactive:

let concurrentQueue = DispatchQueue(label: "myConcurrentQueue", qos: .background, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)

Нет причин, по которым эта очередь должна использовать эту опцию, и, поскольку кажется, что вы никогда не вызываете dispatch_activate(), очередь никогда не выполнит никаких блоков.

Примечание. Это очень скрытая опция очереди, и, как правило, вы не должны использовать ее, если у вас нет очень веской причины.

0 голосов
/ 09 июля 2020

Вероятно, пользовательский интерфейс заблокирован из-за указанной ниже операции пользовательского интерфейса в concurrentQueue

activity.startAnimating()

Это действие пользовательского интерфейса, и, вероятно, вы можете получить исключение или обратную трассировку, в которой упоминается, что операции пользовательского интерфейса должны выполняться в основном потоке. Попробуйте удалить / переместить activity.startAnimating () в основной поток. Пользовательский интерфейс может не блокироваться и вести себя не так, как вы ожидали.

Даже если вы использовали concurrentQueue, загрузка изображения пользовательского интерфейса выполняется в основном потоке с помощью DispatchQueue.main.asyn c, это должно быть нормально.

...