Browse Source

【优化】增加缩图缓存

lizhe 7 months ago
parent
commit
0e7b5554d5

+ 18 - 5
PDF Office/PDF Master/Class/PDFTools/Merge/View/KMPDFThumbnialPageView.swift

@@ -11,8 +11,13 @@ class KMPDFThumbnialPageView: NSView {
     private var pendingWordItem: DispatchWorkItem?
     var page: CPDFPage? {
         didSet {
-            self.pageImageIv.image = NSImage()
-            self.performTask()
+            let image = KMThumbnailCache.shared.thumbnail(for: Int(self.page?.pageIndex() ?? UInt(Int.max)))
+            if image != nil {
+                self.pageImageIv.image = image
+            } else {
+                self.pageImageIv.image = NSImage()
+                self.performTask()
+            }
         }
     }
     
@@ -50,14 +55,22 @@ class KMPDFThumbnialPageView: NSView {
         let newWorkItem = DispatchWorkItem {
             self.updateThumbnial()
         }
-        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.01, execute:newWorkItem)
+        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.3, execute:newWorkItem)
         pendingWordItem = newWorkItem
     }
     
     func updateThumbnial(needReset: Bool = false) {
         print(self.bounds.size);
-        self.page?.thumbnail(of: self.bounds.size, needReset: needReset, completion: { [unowned self] image in
+        let image = KMThumbnailCache.shared.thumbnail(for: Int(self.page?.pageIndex() ?? UInt(Int.max)))
+        if image != nil {
             self.pageImageIv.image = image
-        })
+        } else {
+            self.page?.thumbnail(of: self.bounds.size, needReset: needReset, completion: { [unowned self] image in
+                if (image != nil) {
+                    self.pageImageIv.image = image
+                    KMThumbnailCache.shared.addThumbnail(id: Int(self.page?.pageIndex() ?? UInt(Int.max)), image: image!)
+                }
+            })
+        }
     }
 }

+ 5 - 5
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController.swift

@@ -1062,10 +1062,10 @@ extension KMLeftSideViewController: NSTableViewDelegate, NSTableViewDataSource {
             cell.pageNumLabel.stringValue = thumbnail.label
             cell.pageView.isThumb = true
             cell.pageView.page = self.pdfDocument()?.page(at: UInt(row))
-            if thumbnail.dirty {
-                cell.pageView.updateThumbnial(needReset: true)
-                thumbnail.dirty = false
-            }
+//            if thumbnail.dirty {
+//                cell.pageView.updateThumbnial(needReset: true)
+//                thumbnail.dirty = false
+//            }
 
             if (self.isDisplayPageSize) {
                 cell.sizeLabel.isHidden = false
@@ -1230,7 +1230,7 @@ extension KMLeftSideViewController: NSTableViewDelegate, NSTableViewDataSource {
         } else if self.groupedFindTableView.isEqual(to: notification.object) {
             //            [self updateFindResultHighlightsForDirection:NSDirectSelection];
         } else if self.thumbnailTableView.isEqual(to: notification.object) {
-            self.thumbnailTableView.ks_reloadData()
+//            self.thumbnailTableView.ks_reloadData()
         } else if self.snapshotTableView.isEqual(to: notification.object) {
             let row = self.snapshotTableView.selectedRow
             // 更新选中数据

+ 44 - 0
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Model/KMThumbnailCache.swift

@@ -0,0 +1,44 @@
+//
+//  KMThumbnailCache.swift
+//  PDF Reader Pro
+//
+//  Created by lizhe on 2024/8/9.
+//
+
+class KMThumbnailCache: NSObject {
+    static let shared = KMThumbnailCache()
+    
+    private let maxCacheSize = 50
+    private var thumbnails: [Int: NSImage] = [:]
+    private var order: [Int] = [] // 记录插入顺序的数组
+
+    func addThumbnail(id: Int, image: NSImage) {
+        if thumbnails.count >= maxCacheSize {
+            if let oldestID = order.first {
+                thumbnails.removeValue(forKey: oldestID)
+                order.removeFirst()
+            }
+        }
+        
+        thumbnails[id] = image
+        order.append(id)
+    }
+    
+    func thumbnail(for id: Int) -> NSImage? {
+        return thumbnails[id]
+    }
+    
+    func removeThumbnail(for id: Int) {
+        if let index = order.firstIndex(of: id) {
+            thumbnails.removeValue(forKey: id)
+            order.remove(at: index)
+        } else {
+            print("ID not found")
+        }
+    }
+    
+    func clearCache() {
+        thumbnails.removeAll()
+        order.removeAll()
+    }
+}

+ 8 - 0
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -1582,6 +1582,9 @@
 		AD5374952C65A426002DE248 /* default.metallib in Resources */ = {isa = PBXBuildFile; fileRef = AD5374942C65A426002DE248 /* default.metallib */; };
 		AD5374962C65A426002DE248 /* default.metallib in Resources */ = {isa = PBXBuildFile; fileRef = AD5374942C65A426002DE248 /* default.metallib */; };
 		AD5374972C65A426002DE248 /* default.metallib in Resources */ = {isa = PBXBuildFile; fileRef = AD5374942C65A426002DE248 /* default.metallib */; };
+		AD53749E2C65E1E1002DE248 /* KMThumbnailCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD53749D2C65E1E1002DE248 /* KMThumbnailCache.swift */; };
+		AD53749F2C65E1E1002DE248 /* KMThumbnailCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD53749D2C65E1E1002DE248 /* KMThumbnailCache.swift */; };
+		AD5374A02C65E1E1002DE248 /* KMThumbnailCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD53749D2C65E1E1002DE248 /* KMThumbnailCache.swift */; };
 		AD53AF8F2BF1BC9200DCFFFC /* KMLoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD53AF8E2BF1BC9200DCFFFC /* KMLoadingView.swift */; };
 		AD53AF902BF1BC9200DCFFFC /* KMLoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD53AF8E2BF1BC9200DCFFFC /* KMLoadingView.swift */; };
 		AD53AF912BF1BC9200DCFFFC /* KMLoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD53AF8E2BF1BC9200DCFFFC /* KMLoadingView.swift */; };
@@ -6046,6 +6049,7 @@
 		AD3AAD922B1034C000DE5FE7 /* KMHeaderFooterView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMHeaderFooterView.xib; sourceTree = "<group>"; };
 		AD4C71702B9ADFE0003A6286 /* NSError_Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSError_Extensions.swift; sourceTree = "<group>"; };
 		AD5374942C65A426002DE248 /* default.metallib */ = {isa = PBXFileReference; lastKnownFileType = "archive.metal-library"; path = default.metallib; sourceTree = "<group>"; };
+		AD53749D2C65E1E1002DE248 /* KMThumbnailCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMThumbnailCache.swift; sourceTree = "<group>"; };
 		AD53AF8E2BF1BC9200DCFFFC /* KMLoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMLoadingView.swift; sourceTree = "<group>"; };
 		AD53AF922BF1BCA300DCFFFC /* KMLoadingView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMLoadingView.xib; sourceTree = "<group>"; };
 		AD53B6FD29AC5FCD00D61E81 /* KMLightMemberToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMLightMemberToken.swift; sourceTree = "<group>"; };
@@ -13456,6 +13460,7 @@
 				BBC8A76C2B05EDDE00FA9377 /* KMThumbnail.swift */,
 				BBED0C2B2BBD569300511FAE /* KMAnnotationModel.swift */,
 				BB8363992C199C20002CE43A /* KMBotaModel.swift */,
+				AD53749D2C65E1E1002DE248 /* KMThumbnailCache.swift */,
 			);
 			path = Model;
 			sourceTree = "<group>";
@@ -16960,6 +16965,7 @@
 				BBF62C682B033B34007B7E86 /* KMPDFEditExtractWindow.swift in Sources */,
 				BB3A669E2B0752A800575343 /* KMTocOutlineView.swift in Sources */,
 				BB2F9AB32AFCC2F800F9DD93 /* KMProfileInfoWindowController.swift in Sources */,
+				AD53749E2C65E1E1002DE248 /* KMThumbnailCache.swift in Sources */,
 				ADE3C1AB29A4779E00793B13 /* KMPrintAccessoryController.swift in Sources */,
 				ADDF83922B391A5D00A81A4E /* DSignatureFilelistRow.swift in Sources */,
 				BB8F4557295AA1270037EA22 /* KMHeaderFooterPropertyInfoController.swift in Sources */,
@@ -17944,6 +17950,7 @@
 				9F02017F2A1BAC1600C9B673 /* KMAIRewritingVC.swift in Sources */,
 				9FDD0F78294FEF64000C4DAD /* KMConvertPDFManager.swift in Sources */,
 				BBBB6CD72AD150D20035AA66 /* CPDFCircleAnnotation+PDFListView.swift in Sources */,
+				AD53749F2C65E1E1002DE248 /* KMThumbnailCache.swift in Sources */,
 				9FDCD81E2B6CDEFE00E22166 /* KMAnnotationChoiceWidgeOptionsTextField.swift in Sources */,
 				8942F80429262B2E00389627 /* KMSideViewController.swift in Sources */,
 				BB1D41D42B26D9BD00994EDC /* KMReusable.swift in Sources */,
@@ -19414,6 +19421,7 @@
 				BB1B0ACD2B4FC6E900889528 /* KMFunctionGuideWindowController.swift in Sources */,
 				8942F7BD29222C7E00389627 /* KMBookCellView.swift in Sources */,
 				9F1FE4C229406E4700E952CA /* NSWindow+CTThemed.m in Sources */,
+				AD5374A02C65E1E1002DE248 /* KMThumbnailCache.swift in Sources */,
 				BB147001299DC0D100784A6A /* OIDRedirectHTTPHandler.m in Sources */,
 				AD7D5C9D2B8F20FE006562CD /* synctex_parser.m in Sources */,
 				89E4E6EE2963D1B7002DBA6F /* KMColorPickerViewController.m in Sources */,