CollectionView - Перенос PDF-файла в collectionView (loadObject (ofClass :) не работает должным образом) - PullRequest
0 голосов
/ 30 ноября 2018

У меня проблема с загрузкой PDF-файла из сеанса перетаскивания (с помощью функции перетаскивания UICollectionView *1003*).

Внутри collectionView(_:performDropWith:coordinator), я хочу загрузить отброшенные элементы в фоновом потоке:

func collectionView(_ collectionView: UICollectionView, performDropWith coordinator: UICollectionViewDropCoordinator) {
    // I'm dropping a valid pdf file from the Files app in iOS.

    // I'm using performBackgroundTask because I want to save stuff to the database
    appDelegate.persistentContainer.performBackgroundTask({ (privateContext) in
        for item in coordinator.items {      

            // This correctly returns true      
            if item.dragItem.itemProvider.canLoadObject(ofClass: MyPDFDocument.self) {

                item.dragItem.itemProvider.loadObject(ofClass: MyPDFDocument.self) { (pdfItem, error) in
                   // This is not called
                }

            }
        }
     })

}

final class MyPDFDocument: PDFDocument, NSItemProviderReading {

    public static var readableTypeIdentifiersForItemProvider: [String] {
        return [kUTTypePDF as String]
    }

    public static func object(withItemProviderData data: Data, typeIdentifier: String) throws -> ComicBookPDFDocument {
        return MyPDFDocument(data: data)!
    }

}

Однако это не работает.Блок loadObject(ofClass:) должен вызываться, просто не вызывается.Он отлично работает в основном потоке.

Дело в том, что я не могу поместить блок performBackgroundTask в loadObject(ofClass:) (тогда отброшенные объекты загружаются идеально), потому что если вы отбросите несколько файлов PDF,это приводит к ошибкам слияния при сохранении контекста (поскольку фоновые задачи выполняются одновременно для каждого удаленного файла).

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

...