Browse Source

Revert to Box and associated object

To workaround a compiler crashing.
onevcat 9 years ago
parent
commit
b823987d5d

+ 10 - 10
Kingfisher.xcodeproj/project.pbxproj

@@ -18,16 +18,16 @@
 		4B3766A21C47944D0001443F /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B3766A11C47944D0001443F /* CFNetwork.framework */; };
 		4B98674F1CD1CF42003ADAC7 /* AnimatedImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B98674E1CD1CF42003ADAC7 /* AnimatedImageView.swift */; };
 		4B9867501CD1CF42003ADAC7 /* AnimatedImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B98674E1CD1CF42003ADAC7 /* AnimatedImageView.swift */; };
+		4BD775A11D86A2330036F91C /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BD775A01D86A2330036F91C /* Box.swift */; };
+		4BD775A21D86A2330036F91C /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BD775A01D86A2330036F91C /* Box.swift */; };
+		4BD775A31D86A2330036F91C /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BD775A01D86A2330036F91C /* Box.swift */; };
+		4BD775A41D86A2330036F91C /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BD775A01D86A2330036F91C /* Box.swift */; };
 		B43007AC86DBFFFD1AC6EDD1 /* libPods-KingfisherTests-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 798E024A9311DC80470CF240 /* libPods-KingfisherTests-tvOS.a */; };
 		CD2C73541D7F040B00A1D819 /* Indicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2C73531D7F040B00A1D819 /* Indicator.swift */; };
 		CD2C73551D7F040B00A1D819 /* Indicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2C73531D7F040B00A1D819 /* Indicator.swift */; };
 		CD2C73561D7F040B00A1D819 /* Indicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2C73531D7F040B00A1D819 /* Indicator.swift */; };
 		CD2C736B1D80231E00A1D819 /* loader.gif in Resources */ = {isa = PBXBuildFile; fileRef = CD2C736A1D80231E00A1D819 /* loader.gif */; };
 		CD2C736D1D80234F00A1D819 /* loader.gif in Resources */ = {isa = PBXBuildFile; fileRef = CD2C736C1D80234F00A1D819 /* loader.gif */; };
-		CD4593971D7EAB9900FD570E /* WrappedAssociatedObjects.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4593961D7EAB9900FD570E /* WrappedAssociatedObjects.swift */; };
-		CD4593981D7EAB9900FD570E /* WrappedAssociatedObjects.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4593961D7EAB9900FD570E /* WrappedAssociatedObjects.swift */; };
-		CD4593991D7EAB9900FD570E /* WrappedAssociatedObjects.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4593961D7EAB9900FD570E /* WrappedAssociatedObjects.swift */; };
-		CD45939A1D7EAB9900FD570E /* WrappedAssociatedObjects.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4593961D7EAB9900FD570E /* WrappedAssociatedObjects.swift */; };
 		D10945F71C526B86001408EB /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = D10945EA1C526B6C001408EB /* Image.swift */; };
 		D10945F81C526B86001408EB /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = D10945EB1C526B6C001408EB /* ImageCache.swift */; };
 		D10945F91C526B86001408EB /* ImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = D10945EC1C526B6C001408EB /* ImageDownloader.swift */; };
@@ -270,6 +270,7 @@
 		4B3766A11C47944D0001443F /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; };
 		4B3E714D1B01FEB200F5AAED /* WatchKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WatchKit.framework; path = System/Library/Frameworks/WatchKit.framework; sourceTree = SDKROOT; };
 		4B98674E1CD1CF42003ADAC7 /* AnimatedImageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AnimatedImageView.swift; path = Sources/AnimatedImageView.swift; sourceTree = "<group>"; };
+		4BD775A01D86A2330036F91C /* Box.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Box.swift; path = Sources/Box.swift; sourceTree = "<group>"; };
 		50ECD18204CB0CD37B49F631 /* libPods-KingfisherTests-OSX.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-KingfisherTests-OSX.a"; sourceTree = BUILT_PRODUCTS_DIR; };
 		74477D1C4379728A8DA673FB /* Pods-KingfisherTests-OSX.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KingfisherTests-OSX.debug.xcconfig"; path = "Pods/Target Support Files/Pods-KingfisherTests-OSX/Pods-KingfisherTests-OSX.debug.xcconfig"; sourceTree = "<group>"; };
 		798E024A9311DC80470CF240 /* libPods-KingfisherTests-tvOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-KingfisherTests-tvOS.a"; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -279,7 +280,6 @@
 		CD2C73531D7F040B00A1D819 /* Indicator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Indicator.swift; path = Sources/Indicator.swift; sourceTree = "<group>"; };
 		CD2C736A1D80231E00A1D819 /* loader.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; name = loader.gif; path = images/loader.gif; sourceTree = SOURCE_ROOT; };
 		CD2C736C1D80234F00A1D819 /* loader.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; name = loader.gif; path = images/loader.gif; sourceTree = SOURCE_ROOT; };
-		CD4593961D7EAB9900FD570E /* WrappedAssociatedObjects.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WrappedAssociatedObjects.swift; path = Sources/WrappedAssociatedObjects.swift; sourceTree = "<group>"; };
 		D10945EA1C526B6C001408EB /* Image.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Sources/Image.swift; sourceTree = "<group>"; };
 		D10945EB1C526B6C001408EB /* ImageCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ImageCache.swift; path = Sources/ImageCache.swift; sourceTree = "<group>"; };
 		D10945EC1C526B6C001408EB /* ImageDownloader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ImageDownloader.swift; path = Sources/ImageDownloader.swift; sourceTree = "<group>"; };
@@ -470,9 +470,9 @@
 				D10945F31C526B6C001408EB /* Resource.swift */,
 				D10945F41C526B6C001408EB /* String+MD5.swift */,
 				D10945F51C526B6C001408EB /* ThreadHelper.swift */,
+				4BD775A01D86A2330036F91C /* Box.swift */,
 				D10945F61C526B6C001408EB /* UIButton+Kingfisher.swift */,
 				182FFF771CC9ACBA004B728D /* NSButton+Kingfisher.swift */,
-				CD4593961D7EAB9900FD570E /* WrappedAssociatedObjects.swift */,
 				CD2C73531D7F040B00A1D819 /* Indicator.swift */,
 			);
 			name = Sources;
@@ -1245,6 +1245,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				D109461A1C526C61001408EB /* Image.swift in Sources */,
+				4BD775A31D86A2330036F91C /* Box.swift in Sources */,
 				CD2C73561D7F040B00A1D819 /* Indicator.swift in Sources */,
 				D109461B1C526C61001408EB /* ImageCache.swift in Sources */,
 				D109461C1C526C61001408EB /* ImageDownloader.swift in Sources */,
@@ -1252,7 +1253,6 @@
 				D109461E1C526C61001408EB /* ImageView+Kingfisher.swift in Sources */,
 				D109461F1C526C61001408EB /* KingfisherManager.swift in Sources */,
 				182FFF781CC9ACBA004B728D /* NSButton+Kingfisher.swift in Sources */,
-				CD4593991D7EAB9900FD570E /* WrappedAssociatedObjects.swift in Sources */,
 				D10946201C526C61001408EB /* KingfisherOptionsInfo.swift in Sources */,
 				D10946211C526C61001408EB /* Resource.swift in Sources */,
 				D9638BA21C7DBA660046523D /* ImagePrefetcher.swift in Sources */,
@@ -1318,7 +1318,6 @@
 			files = (
 				D109460E1C526C0D001408EB /* Image.swift in Sources */,
 				4B9867501CD1CF42003ADAC7 /* AnimatedImageView.swift in Sources */,
-				CD4593981D7EAB9900FD570E /* WrappedAssociatedObjects.swift in Sources */,
 				D109460F1C526C0D001408EB /* ImageCache.swift in Sources */,
 				D10946101C526C0D001408EB /* ImageDownloader.swift in Sources */,
 				D10946111C526C0D001408EB /* ImageTransition.swift in Sources */,
@@ -1326,6 +1325,7 @@
 				D10946131C526C0D001408EB /* KingfisherManager.swift in Sources */,
 				D10946141C526C0D001408EB /* KingfisherOptionsInfo.swift in Sources */,
 				D9638BA11C7DBA660046523D /* ImagePrefetcher.swift in Sources */,
+				4BD775A21D86A2330036F91C /* Box.swift in Sources */,
 				D10946151C526C0D001408EB /* Resource.swift in Sources */,
 				D10946161C526C0D001408EB /* String+MD5.swift in Sources */,
 				D10946171C526C0D001408EB /* ThreadHelper.swift in Sources */,
@@ -1340,10 +1340,10 @@
 			files = (
 				D109462D1C526CF5001408EB /* ImageTransition.swift in Sources */,
 				D10946251C526CE8001408EB /* Image.swift in Sources */,
-				CD45939A1D7EAB9900FD570E /* WrappedAssociatedObjects.swift in Sources */,
 				D10946261C526CE8001408EB /* ImageCache.swift in Sources */,
 				D9638BA31C7DBA660046523D /* ImagePrefetcher.swift in Sources */,
 				D10946271C526CE8001408EB /* ImageDownloader.swift in Sources */,
+				4BD775A41D86A2330036F91C /* Box.swift in Sources */,
 				D10946281C526CE8001408EB /* KingfisherManager.swift in Sources */,
 				D10946291C526CE8001408EB /* KingfisherOptionsInfo.swift in Sources */,
 				D109462A1C526CE8001408EB /* Resource.swift in Sources */,
@@ -1377,7 +1377,6 @@
 			files = (
 				D10945F71C526B86001408EB /* Image.swift in Sources */,
 				4B98674F1CD1CF42003ADAC7 /* AnimatedImageView.swift in Sources */,
-				CD4593971D7EAB9900FD570E /* WrappedAssociatedObjects.swift in Sources */,
 				D10945F81C526B86001408EB /* ImageCache.swift in Sources */,
 				D10945F91C526B86001408EB /* ImageDownloader.swift in Sources */,
 				D10945FA1C526B86001408EB /* ImageTransition.swift in Sources */,
@@ -1385,6 +1384,7 @@
 				D10945FC1C526B86001408EB /* KingfisherManager.swift in Sources */,
 				D10945FD1C526B86001408EB /* KingfisherOptionsInfo.swift in Sources */,
 				D9638BA01C7DBA660046523D /* ImagePrefetcher.swift in Sources */,
+				4BD775A11D86A2330036F91C /* Box.swift in Sources */,
 				D10945FE1C526B86001408EB /* Resource.swift in Sources */,
 				D10945FF1C526B86001408EB /* String+MD5.swift in Sources */,
 				D10946001C526B86001408EB /* ThreadHelper.swift in Sources */,

+ 16 - 0
Sources/Box.swift

@@ -0,0 +1,16 @@
+//
+//  Box.swift
+//  Kingfisher
+//
+//  Created by WANG WEI on 2016/09/12.
+//  Copyright © 2016年 Wei Wang. All rights reserved.
+//
+
+import Foundation
+
+class Box<T> {
+    let value: T
+    init(value: T) {
+        self.value = value
+    }
+}

+ 8 - 8
Sources/Image.swift

@@ -56,19 +56,19 @@ extension Image {
     
     private(set) var kf_images: [Image]? {
         get {
-            return getAssociatedObject(self, associativeKey: &imagesKey)
+            return objc_getAssociatedObject(self, &imagesKey) as? [Image]
         }
         set {
-            setAssociatedObject(self, value: newValue, associativeKey: &imagesKey)
+            objc_setAssociatedObject(self, &imagesKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
         }
     }
     
     private(set) var kf_duration: NSTimeInterval {
         get {
-            return getAssociatedObject(self, associativeKey: &durationKey) ?? 0.0
+            return objc_getAssociatedObject(self, &durationKey) as? NSTimeInterval ?? 0.0
         }
         set {
-            setAssociatedObject(self, value: newValue, associativeKey: &durationKey)
+            objc_setAssociatedObject(self, &durationKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
         }
     }
     
@@ -87,19 +87,19 @@ extension Image {
     
     private(set) var kf_imageSource: ImageSource? {
             get {
-                return getAssociatedObject(self, associativeKey: &imageSourceKey)
+                return objc_getAssociatedObject(self, &imageSourceKey) as? ImageSource
             }
             set {
-                setAssociatedObject(self, value: newValue, associativeKey: &imageSourceKey)
+                objc_setAssociatedObject(self, &imageSourceKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
             }
         }
         
     private(set) var kf_animatedImageData: NSData? {
             get {
-                return getAssociatedObject(self, associativeKey: &animatedImageDataKey)
+                return objc_getAssociatedObject(self, &animatedImageDataKey) as? NSData
             }
             set {
-                setAssociatedObject(self, value: newValue, associativeKey: &animatedImageDataKey)
+                objc_setAssociatedObject(self, &animatedImageDataKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
             }
         }
 #endif

+ 8 - 12
Sources/ImageView+Kingfisher.swift

@@ -196,18 +196,17 @@ extension ImageView {
 // MARK: - Associated Object
 private var lastURLKey: Void?
 private var indicatorKey: Void?
-private var showIndicatorWhenLoadingKey: Void?
 private var indicatorTypeKey: Void?
 private var imageTaskKey: Void?
 
 extension ImageView {
     /// Get the image URL binded to this image view.
     public var kf_webURL: NSURL? {
-        return getAssociatedObject(self, associativeKey: &lastURLKey)
+        return objc_getAssociatedObject(self, &lastURLKey) as? NSURL
     }
     
     private func kf_setWebURL(URL: NSURL) {
-        setAssociatedObject(self, value: URL, associativeKey: &lastURLKey)
+        objc_setAssociatedObject(self, &lastURLKey, URL, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
     }
 
     
@@ -237,7 +236,7 @@ extension ImageView {
     /// Default is .None
     public var kf_indicatorType: IndicatorType {
         get {
-            let indicator: IndicatorType? = getAssociatedObject(self, associativeKey: &indicatorTypeKey)
+            let indicator = (objc_getAssociatedObject(self, &indicatorTypeKey) as? Box<IndicatorType?>)?.value
             return indicator ?? .None
         }
         
@@ -253,7 +252,7 @@ extension ImageView {
                 kf_indicator = indicator
             }
 
-            setAssociatedObject(self, value: newValue, associativeKey: &indicatorTypeKey)
+            objc_setAssociatedObject(self, &indicatorTypeKey, Box(value: newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
         }
     }
 
@@ -262,8 +261,7 @@ extension ImageView {
     /// Everything will be `nil` if `kf_indicatorType` is .None.
     public private(set) var kf_indicator: Indicator? {
         get {
-            let indicator: (Indicator?)? = getAssociatedObject(self, associativeKey: &indicatorKey)
-            return indicator ?? nil
+            return (objc_getAssociatedObject(self, &indicatorKey) as? Box<Indicator?>)?.value
         }
 
         set {
@@ -281,17 +279,15 @@ extension ImageView {
             }
 
             // Save in associated object
-            setAssociatedObject(self,
-                                value: newValue,
-                                associativeKey: &indicatorKey)
+            objc_setAssociatedObject(self, &indicatorKey, Box(value: newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
         }
     }
 
     private var kf_imageTask: RetrieveImageTask? {
-        return getAssociatedObject(self, associativeKey: &imageTaskKey)
+        return objc_getAssociatedObject(self, &imageTaskKey) as? RetrieveImageTask
     }
     
     private func kf_setImageTask(task: RetrieveImageTask?) {
-        setAssociatedObject(self, value: task, associativeKey: &imageTaskKey)
+        objc_setAssociatedObject(self, &imageTaskKey, task, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
     }
 }

+ 8 - 8
Sources/UIButton+Kingfisher.swift

@@ -140,7 +140,7 @@ extension UIButton {
     }
     
     private var kf_webURLs: NSMutableDictionary {
-        var dictionary:NSMutableDictionary? = getAssociatedObject(self, associativeKey: &lastURLKey)
+        var dictionary = objc_getAssociatedObject(self, &lastURLKey) as? NSMutableDictionary
         if dictionary == nil {
             dictionary = NSMutableDictionary()
             kf_setWebURLs(dictionary!)
@@ -149,15 +149,15 @@ extension UIButton {
     }
     
     private func kf_setWebURLs(URLs: NSMutableDictionary) {
-        setAssociatedObject(self, value: URLs, associativeKey: &lastURLKey)
+        objc_setAssociatedObject(self, &lastURLKey, URLs, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
     }
     
     private var kf_imageTask: RetrieveImageTask? {
-        return getAssociatedObject(self, associativeKey: &imageTaskKey)
+        return objc_getAssociatedObject(self, &imageTaskKey) as? RetrieveImageTask
     }
     
     private func kf_setImageTask(task: RetrieveImageTask?) {
-        setAssociatedObject(self, value: task, associativeKey: &imageTaskKey)
+        objc_setAssociatedObject(self, &imageTaskKey, task, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
     }
 }
 
@@ -276,7 +276,7 @@ extension UIButton {
     }
     
     private var kf_backgroundWebURLs: NSMutableDictionary {
-        var dictionary:NSMutableDictionary? = getAssociatedObject(self, associativeKey: &lastBackgroundURLKey)
+        var dictionary = objc_getAssociatedObject(self, &lastBackgroundURLKey) as? NSMutableDictionary
         if dictionary == nil {
             dictionary = NSMutableDictionary()
             kf_setBackgroundWebURLs(dictionary!)
@@ -285,15 +285,15 @@ extension UIButton {
     }
     
     private func kf_setBackgroundWebURLs(URLs: NSMutableDictionary) {
-        setAssociatedObject(self, value: URLs, associativeKey: &lastBackgroundURLKey)
+        objc_setAssociatedObject(self, &lastBackgroundURLKey, URLs, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
     }
     
     private var kf_backgroundImageTask: RetrieveImageTask? {
-        return getAssociatedObject(self, associativeKey: &backgroundImageTaskKey)
+        return objc_getAssociatedObject(self, &backgroundImageTaskKey) as? RetrieveImageTask
     }
     
     private func kf_setBackgroundImageTask(task: RetrieveImageTask?) {
-        setAssociatedObject(self, value: task, associativeKey: &backgroundImageTaskKey)
+        objc_setAssociatedObject(self, &backgroundImageTaskKey, task, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
     }
 }
 

+ 0 - 45
Sources/WrappedAssociatedObjects.swift

@@ -1,45 +0,0 @@
-//
-//  AssociatedObjects.swift
-//  Kingfisher
-//
-//  Created by João D. Moreira on 31/08/16.
-//  Copyright © 2016 Wei Wang. All rights reserved.
-//
-
-import ObjectiveC
-
-/**
- *	This file provides a wrapper around Objective-C runtime associated objects.
- *  All values are wrapped in an instance of Wrapper allowing us to persist Swift value types.
- */
-private final class Wrapper<T> {
-    let value: T
-    init(_ x: T) {
-        value = x
-    }
-}
-
-private func wrap<T>(x: T) -> Wrapper<T> {
-    return Wrapper(x)
-}
-
-func setAssociatedObject<T>(object: AnyObject, value: T, associativeKey: UnsafePointer<Void>, policy: objc_AssociationPolicy = .OBJC_ASSOCIATION_RETAIN_NONATOMIC) {
-    if let v: AnyObject = value as? AnyObject {
-        objc_setAssociatedObject(object, associativeKey, v, policy)
-    } else {
-        objc_setAssociatedObject(object, associativeKey, wrap(value), policy)
-    }
-}
-
-func getAssociatedObject<T>(object: AnyObject, associativeKey: UnsafePointer<Void>) -> T? {
-
-    let v = objc_getAssociatedObject(object, associativeKey)
-
-    if let v = v as? T {
-        return v
-    } else if let v = v as? Wrapper<T> {
-        return v.value
-    } else {
-        return nil
-    }
-}