Преглед изворни кода

【数据】图片加载信号量卡死修复

lizhe пре 2 година
родитељ
комит
2cfc931cd8

+ 105 - 25
KMAdvertisement.xcodeproj/xcuserdata/lizhe.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -103,10 +103,42 @@
             filePath = "KMAdvertisement/UI/View/Mac/KMAdvertisementShowView.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "142"
-            endingLineNumber = "142"
+            startingLineNumber = "144"
+            endingLineNumber = "144"
             landmarkName = "cancelAction(_:)"
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "7D110CD4-7173-4A02-96B8-2FDCCD09D2B4 - 5b1f3f23b9dde571"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "KMAdvertisement.KMAdvertisementShowView.cancelAction(Any) -&gt; ()"
+                  moduleName = "KMAdvertisement"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/CloudServer/KMAdvertisement/UI/View/Mac/KMAdvertisementShowView.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "142"
+                  endingLineNumber = "142"
+                  offsetFromSymbolStart = "124">
+               </Location>
+               <Location
+                  uuid = "7D110CD4-7173-4A02-96B8-2FDCCD09D2B4 - 5b1f3f23b9dde533"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "KMAdvertisement.KMAdvertisementShowView.cancelAction(Any) -&gt; ()"
+                  moduleName = "KMAdvertisement"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/CloudServer/KMAdvertisement/UI/View/Mac/KMAdvertisementShowView.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "144"
+                  endingLineNumber = "144"
+                  offsetFromSymbolStart = "124">
+               </Location>
+            </Locations>
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
@@ -119,10 +151,42 @@
             filePath = "KMAdvertisement/UI/View/Mac/KMAdvertisementShowView.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "153"
-            endingLineNumber = "153"
+            startingLineNumber = "155"
+            endingLineNumber = "155"
             landmarkName = "cancelAction(_:)"
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "EEE29A07-8C3F-443F-BC48-75081682E8A7 - 5b1f3f23b9dde404"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "KMAdvertisement.KMAdvertisementShowView.cancelAction(Any) -&gt; ()"
+                  moduleName = "KMAdvertisement"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/CloudServer/KMAdvertisement/UI/View/Mac/KMAdvertisementShowView.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "153"
+                  endingLineNumber = "153"
+                  offsetFromSymbolStart = "1020">
+               </Location>
+               <Location
+                  uuid = "EEE29A07-8C3F-443F-BC48-75081682E8A7 - 5b1f3f23b9dde7c6"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "KMAdvertisement.KMAdvertisementShowView.cancelAction(Any) -&gt; ()"
+                  moduleName = "KMAdvertisement"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/CloudServer/KMAdvertisement/UI/View/Mac/KMAdvertisementShowView.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "155"
+                  endingLineNumber = "155"
+                  offsetFromSymbolStart = "1020">
+               </Location>
+            </Locations>
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
@@ -240,33 +304,49 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "3886EFE1-42AF-4725-9A49-E7FEFC1B57E1"
+            uuid = "1316571D-D1E4-4E70-8BC0-F317FDA3B5B8"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "KMAdvertisement/Extension/Image/KMAdvertisementImage.swift"
+            filePath = "KMAdvertisement/UI/List/Mac/Cell/KMAdvertisementCollectionViewItem.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "49"
-            endingLineNumber = "49"
-            landmarkName = "saveImageCache(image:name:)"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "61A61423-C761-4FAE-8A97-D1355A00A6F6"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "KMAdvertisement/Model/KMAdvertisementModelTransition.swift"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "95"
-            endingLineNumber = "95"
-            landmarkName = "getLanguageType()"
+            startingLineNumber = "48"
+            endingLineNumber = "48"
+            landmarkName = "updateColor(_:)"
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "1316571D-D1E4-4E70-8BC0-F317FDA3B5B8 - 815eabff0068ad52"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "KMAdvertisement.KMAdvertisementCollectionViewItem.updateColor(Swift.Bool) -&gt; ()"
+                  moduleName = "KMAdvertisement"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/CloudServer/KMAdvertisement/UI/List/Mac/Cell/KMAdvertisementCollectionViewItem.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "48"
+                  endingLineNumber = "48"
+                  offsetFromSymbolStart = "15000">
+               </Location>
+               <Location
+                  uuid = "1316571D-D1E4-4E70-8BC0-F317FDA3B5B8 - b4ed8f74e94520ec"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "closure #1 (__C.NSImage) -&gt; () in KMAdvertisement.KMAdvertisementCollectionViewItem.updateColor(Swift.Bool) -&gt; ()"
+                  moduleName = "KMAdvertisement"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/CloudServer/KMAdvertisement/UI/List/Mac/Cell/KMAdvertisementCollectionViewItem.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "48"
+                  endingLineNumber = "48"
+                  offsetFromSymbolStart = "68">
+               </Location>
+            </Locations>
          </BreakpointContent>
       </BreakpointProxy>
    </Breakpoints>

+ 11 - 4
KMAdvertisement/Extension/Image/KMAdvertisementImage.swift

@@ -7,8 +7,10 @@
 
 import Foundation
 import AppKit
+
+typealias KMAdvertisementImageCompletion = (_ image: NSImage) -> Void
 class KMAdvertisementImage: NSObject {
-    static func imageWithURL(url : URL?) -> NSImage {
+    static func imageWithURL(url : URL?, completion: KMAdvertisementImageCompletion?) -> NSImage {
         var image: NSImage = NSImage()
         if url != nil {
             //获取缓存图片是否存在
@@ -16,21 +18,26 @@ class KMAdvertisementImage: NSObject {
             if imageString != "" {
                 //存在获取本地图片
                 image = NSImage.init(contentsOfFile: imageString) ?? NSImage()
+                if completion != nil {
+                    completion!(image)
+                }
             } else {
                 //不存在异步获取网络图片
-                let semaphore = DispatchSemaphore(value: 0)
                 DispatchQueue.global().async {
                     do {
                         let imageData = try Data(contentsOf: url!)
                         image = NSImage(data: imageData) ?? NSImage()
                         //获取图片成功保存图片
                         KMAdvertisementImageCache.saveImageCache(image: image, name: NSString(string: url!.path).lastPathComponent)
+                        if completion != nil {
+                            DispatchQueue.main.async {
+                                completion!(image)
+                            }
+                        }
                     } catch {
                         print(error)
                     }
-                    semaphore.signal()
                 }
-                semaphore.wait()
             }
         }
         return image

+ 3 - 1
KMAdvertisement/UI/List/Mac/Cell/KMAdvertisementCollectionViewItem.swift

@@ -45,7 +45,9 @@ class KMAdvertisementCollectionViewItem: NSCollectionViewItem {
         
         if model.imageURL != nil {
             let url = URL(string: KMAdvertisementModelTransition.transitionImagePath(image: model.imageURL!, highlight: highlight))
-            self.iconImageView.image = KMAdvertisementImage.imageWithURL(url: url)
+            self.iconImageView.image = KMAdvertisementImage.imageWithURL(url: url, completion: { [unowned self] image in
+                self.iconImageView.image = image
+            })
         }
     }
     

+ 3 - 1
KMAdvertisement/UI/View/Mac/KMAdvertisementShowView.swift

@@ -132,7 +132,9 @@ import Cocoa
 
             if self.data.count != 0 {
                 let url = URL(string: KMAdvertisementModelTransition.transitionImagePath(image: self.data[index].imageURL!, highlight: false))
-                self.imageView.image = KMAdvertisementImage.imageWithURL(url: url)
+                self.imageView.image = KMAdvertisementImage.imageWithURL(url: url, completion: { [unowned self] image in
+                    self.imageView.image = image
+                })
             }
         }
     }

+ 1 - 1
KMAdvertisementDemo_Mac/ViewController.swift

@@ -25,7 +25,7 @@ class ViewController: NSViewController {
 
         // Do any additional setup after loading the view.
         //设置基础参数
-        KMAdvertisementManager.manager.initConfig(appName: .PDFReaderProMacDMG,
+        KMAdvertisementManager.manager.initConfig(appName: .PDFReaderProMac,
                                                   subscribeType: .unsubscribed,
                                                   platform: .Mac)
         //测试模式,默认false