У меня проблема с загрузкой 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,это приводит к ошибкам слияния при сохранении контекста (поскольку фоновые задачи выполняются одновременно для каждого удаленного файла).
Есть идеи, что здесь происходит?Разве нельзя загружать объекты из другого потока?