I am using QlPreviewController in my applications, I am download the data one by one using observer, The observer detects currentIndexItem in the preview controller, The image is only download when the currentIndexItem will changed ,After downloading i will refresh the currentPreviewItem , My Problem is , while downloading an files in first item and i am moving to the next items , which also downloading an files,And both screens are freezing , after click the menu button, in the sections show images is loaded , but not reflected.
While i am calling download data, The thread is changed to Background thread
DispatchQueue.global().async {
interactor.processData(kbPath: categoriesPath)
}
}else{
interactor.processData(kbPath: categoriesPath)
}
This is the downloading file which will happens in Background thread, The above code will change
let url = fileData.contentUrl
let fileName = fileData.name
let contentUrl = fileData.contentUrl
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let destinationURL = documentsURL.appendingPathComponent(fileName)
// Check if the file already exists at the destination URL
if FileManager.default.fileExists(atPath: destinationURL.path){
return completion(.success(File(data: destinationURL, name: fileName, contentUrl: contentUrl, hasData: true)))
}
// If the file doesn't exist, proceed with downloading
let request = URLRequest(url: URL(string: url)!)
let task = URLSession.shared.downloadTask(with: request) {(tempFileURL, response, error) in
if let error = error {
print("Error downloading file: \(error)")
completion(.failure(.FailedToDownload))
return
}
guard let httpResponse = response as? HTTPURLResponse , httpResponse.statusCode == 200,let tempFileURL = tempFileURL else {
print("Failed to download file. Invalid response.")
completion(.failure(.FailedToDownload))
return
}
do {
try FileManager.default.moveItem(at: tempFileURL, to: destinationURL)
completion(.success(File(data: destinationURL, name: fileName, contentUrl: url, hasData: true)))
} catch {
print("Error moving file: \(error)")
completion(.failure(.FailedToDownload))
}
}
task.resume()
}
After Downloading the data , it will inform to the viewcontroller to check the thread and call
DispatchQueue.main.async {
handler()
}
}else{
handler()
}
This is my Observer
if context == &previewControllerContext{
if keyPath == "currentPreviewItemIndex" {
let currentIndex = preview.currentPreviewItemIndex
//api calls for the specific files
if currentIndex < previewData.count && !previewData[currentIndex].hasData {
self.loadingView.startAnimating()
let builder = Builder()
self.previewData[currentIndex].hasData = true
builder.build(instance: self, categoriesPath: .KBDownloadFile(fileData: self.previewData[currentIndex]))
}
}
}else {
super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
}
After downloaded image the result will notify and i will refresh the current previewItem self.preview.refreshCurrentPreviewItem()
The Issue video link -> https://drive.google.com/file/d/18pBZawbvcUU3SA5vS53X9R9q-AGMG5Sv/view
Any one facing this issues with this ,my thought this issues is thread based , but i will handle the thread
QuickLook
RSS for tagCreate previews of files to use inside your app or perform simple edits on previews using QuickLook.
Posts under QuickLook tag
42 Posts
Sort by:
Post
Replies
Boosts
Views
Activity
Is it possible to somehow support copy/update edit modes when using quickLookPreview modifier, like in QLPreviewController? After pressing 'Done' it only allows me to discard or save to files instead.