Forráskód Böngészése

Use bytes as image cost

onevcat 7 éve
szülő
commit
d7a7c2af71

+ 77 - 3
Demo/Demo/Kingfisher-Demo/Base.lproj/Main.storyboard

@@ -72,14 +72,14 @@
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
                         <subviews>
                             <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="dJV-kj-nuj">
                             <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="dJV-kj-nuj">
-                                <rect key="frame" x="35" y="89" width="250" height="250"/>
+                                <rect key="frame" x="35" y="95" width="250" height="250"/>
                                 <constraints>
                                 <constraints>
                                     <constraint firstAttribute="width" secondItem="dJV-kj-nuj" secondAttribute="height" multiplier="1:1" id="Agq-Nz-czc"/>
                                     <constraint firstAttribute="width" secondItem="dJV-kj-nuj" secondAttribute="height" multiplier="1:1" id="Agq-Nz-czc"/>
                                     <constraint firstAttribute="width" constant="250" id="Q7x-LI-VtM"/>
                                     <constraint firstAttribute="width" constant="250" id="Q7x-LI-VtM"/>
                                 </constraints>
                                 </constraints>
                             </imageView>
                             </imageView>
                             <pickerView contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="45M-CC-Cpm">
                             <pickerView contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="45M-CC-Cpm">
-                                <rect key="frame" x="0.0" y="349" width="320" height="131"/>
+                                <rect key="frame" x="0.0" y="355" width="320" height="125"/>
                                 <connections>
                                 <connections>
                                     <outlet property="dataSource" destination="Faj-ZD-Pmu" id="iJ6-7y-h0M"/>
                                     <outlet property="dataSource" destination="Faj-ZD-Pmu" id="iJ6-7y-h0M"/>
                                     <outlet property="delegate" destination="Faj-ZD-Pmu" id="yZp-17-Dfa"/>
                                     <outlet property="delegate" destination="Faj-ZD-Pmu" id="yZp-17-Dfa"/>
@@ -103,7 +103,7 @@
                 </viewController>
                 </viewController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="pci-sI-9qT" userLabel="First Responder" sceneMemberID="firstResponder"/>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="pci-sI-9qT" userLabel="First Responder" sceneMemberID="firstResponder"/>
             </objects>
             </objects>
-            <point key="canvasLocation" x="2060.625" y="1008.75"/>
+            <point key="canvasLocation" x="2061" y="1003"/>
         </scene>
         </scene>
         <!--Navigation Controller-->
         <!--Navigation Controller-->
         <scene sceneID="a89-ss-78Y">
         <scene sceneID="a89-ss-78Y">
@@ -182,6 +182,30 @@
                                             <segue destination="Faj-ZD-Pmu" kind="show" id="ySQ-qt-802"/>
                                             <segue destination="Faj-ZD-Pmu" kind="show" id="ySQ-qt-802"/>
                                         </connections>
                                         </connections>
                                     </tableViewCell>
                                     </tableViewCell>
+                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="N6z-X5-Zzj">
+                                        <rect key="frame" x="0.0" y="88" width="320" height="44"/>
+                                        <autoresizingMask key="autoresizingMask"/>
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="N6z-X5-Zzj" id="0QK-P3-0Ja">
+                                            <rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <subviews>
+                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Infinity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fea-jH-1o0">
+                                                    <rect key="frame" x="20" y="11.5" width="52" height="21"/>
+                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                                    <nil key="textColor"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                            </subviews>
+                                            <constraints>
+                                                <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="fea-jH-1o0" secondAttribute="trailing" constant="20" symbolic="YES" id="9mw-yX-RIO"/>
+                                                <constraint firstItem="fea-jH-1o0" firstAttribute="centerY" secondItem="0QK-P3-0Ja" secondAttribute="centerY" id="dHg-ri-MNi"/>
+                                                <constraint firstItem="fea-jH-1o0" firstAttribute="leading" secondItem="0QK-P3-0Ja" secondAttribute="leading" constant="20" symbolic="YES" id="w5P-03-uTe"/>
+                                            </constraints>
+                                        </tableViewCellContentView>
+                                        <connections>
+                                            <segue destination="cq4-4P-UWj" kind="show" id="tzK-i9-uC0"/>
+                                        </connections>
+                                    </tableViewCell>
                                 </cells>
                                 </cells>
                             </tableViewSection>
                             </tableViewSection>
                         </sections>
                         </sections>
@@ -196,5 +220,55 @@
             </objects>
             </objects>
             <point key="canvasLocation" x="1044" y="645"/>
             <point key="canvasLocation" x="1044" y="645"/>
         </scene>
         </scene>
+        <!--Infinity Collection View Controller-->
+        <scene sceneID="1br-BE-G87">
+            <objects>
+                <collectionViewController id="cq4-4P-UWj" customClass="InfinityCollectionViewController" customModule="Kingfisher_Demo" customModuleProvider="target" sceneMemberID="viewController">
+                    <collectionView key="view" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="prototypes" id="7Sv-Aq-e9P">
+                        <rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="kws-C5-XtN">
+                            <size key="itemSize" width="250" height="250"/>
+                            <size key="headerReferenceSize" width="0.0" height="0.0"/>
+                            <size key="footerReferenceSize" width="0.0" height="0.0"/>
+                            <inset key="sectionInset" minX="0.0" minY="10" maxX="0.0" maxY="10"/>
+                        </collectionViewFlowLayout>
+                        <cells>
+                            <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="collectionViewCell" id="KrJ-Zp-fzY" customClass="ImageCollectionViewCell" customModule="Kingfisher_Demo" customModuleProvider="target">
+                                <rect key="frame" x="35" y="10" width="250" height="250"/>
+                                <autoresizingMask key="autoresizingMask"/>
+                                <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+                                    <rect key="frame" x="0.0" y="0.0" width="250" height="250"/>
+                                    <autoresizingMask key="autoresizingMask"/>
+                                    <subviews>
+                                        <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="ebU-Ze-jO5">
+                                            <rect key="frame" x="0.0" y="0.0" width="250" height="250"/>
+                                        </imageView>
+                                    </subviews>
+                                </view>
+                                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <constraints>
+                                    <constraint firstAttribute="trailing" secondItem="ebU-Ze-jO5" secondAttribute="trailing" id="KnM-v3-kPW"/>
+                                    <constraint firstAttribute="bottom" secondItem="ebU-Ze-jO5" secondAttribute="bottom" id="Kx9-Jc-nTH"/>
+                                    <constraint firstItem="ebU-Ze-jO5" firstAttribute="top" secondItem="KrJ-Zp-fzY" secondAttribute="top" id="dkK-Zo-dbQ"/>
+                                    <constraint firstItem="ebU-Ze-jO5" firstAttribute="leading" secondItem="KrJ-Zp-fzY" secondAttribute="leading" id="iKU-4D-S50"/>
+                                </constraints>
+                                <connections>
+                                    <outlet property="cellImageView" destination="ebU-Ze-jO5" id="w1R-Ic-sJo"/>
+                                </connections>
+                            </collectionViewCell>
+                        </cells>
+                        <connections>
+                            <outlet property="dataSource" destination="cq4-4P-UWj" id="lvC-zS-Qxs"/>
+                            <outlet property="delegate" destination="cq4-4P-UWj" id="VLR-0M-Wdn"/>
+                        </connections>
+                    </collectionView>
+                    <navigationItem key="navigationItem" id="EBb-Hq-SH2"/>
+                </collectionViewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="UWY-iA-aq1" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="2061" y="1688"/>
+        </scene>
     </scenes>
     </scenes>
 </document>
 </document>

+ 58 - 0
Demo/Demo/Kingfisher-Demo/ViewControllers/Infinity/InfinityCollectionViewController.swift

@@ -0,0 +1,58 @@
+//
+//  InfinityCollectionViewController.swift
+//  Kingfisher
+//
+//  Created by Wei Wang on 2018/11/19.
+//
+//  Copyright (c) 2018年 Wei Wang <onevcat@gmail.com>
+//
+//  Permission is hereby granted, free of charge, to any person obtaining a copy
+//  of this software and associated documentation files (the "Software"), to deal
+//  in the Software without restriction, including without limitation the rights
+//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+//  copies of the Software, and to permit persons to whom the Software is
+//  furnished to do so, subject to the following conditions:
+//
+//  The above copyright notice and this permission notice shall be included in
+//  all copies or substantial portions of the Software.
+//
+//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+//  THE SOFTWARE.
+
+import UIKit
+import Kingfisher
+
+private let reuseIdentifier = "collectionViewCell"
+
+class InfinityCollectionViewController: UICollectionViewController {
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        setupOperationNavigationBar()
+    }
+
+    override func numberOfSections(in collectionView: UICollectionView) -> Int {
+        return 1
+    }
+
+    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
+        return 10000000
+    }
+
+    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
+        let cell = collectionView
+            .dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! ImageCollectionViewCell
+        let url = ImageLoader.sampleImageURL(at: indexPath.row % 10)
+
+        // Mark each row as a new image.
+        let resource = ImageResource(downloadURL: url, cacheKey: "key-\(indexPath.row)")
+        cell.cellImageView.kf.setImage(with: resource)
+
+        return cell
+    }
+}

+ 14 - 0
Demo/Kingfisher-Demo.xcodeproj/project.pbxproj

@@ -12,6 +12,8 @@
 		277EAE9D2045B4D500547CD3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 277EAE962045B4D500547CD3 /* Assets.xcassets */; };
 		277EAE9D2045B4D500547CD3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 277EAE962045B4D500547CD3 /* Assets.xcassets */; };
 		277EAEA12045B52800547CD3 /* InterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 277EAE9E2045B52800547CD3 /* InterfaceController.swift */; };
 		277EAEA12045B52800547CD3 /* InterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 277EAE9E2045B52800547CD3 /* InterfaceController.swift */; };
 		277EAEA32045B52800547CD3 /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 277EAEA02045B52800547CD3 /* ExtensionDelegate.swift */; };
 		277EAEA32045B52800547CD3 /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 277EAEA02045B52800547CD3 /* ExtensionDelegate.swift */; };
+		4B1C7A3D21A256E300CE9D31 /* InfinityCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B1C7A3C21A256E300CE9D31 /* InfinityCollectionViewController.swift */; };
+		4B1C7A3E21A256E300CE9D31 /* InfinityCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B1C7A3C21A256E300CE9D31 /* InfinityCollectionViewController.swift */; };
 		4B4307A51D87E6A700ED2DA9 /* loader.gif in Resources */ = {isa = PBXBuildFile; fileRef = 4B7742461D87E42E0077024E /* loader.gif */; };
 		4B4307A51D87E6A700ED2DA9 /* loader.gif in Resources */ = {isa = PBXBuildFile; fileRef = 4B7742461D87E42E0077024E /* loader.gif */; };
 		4B7742471D87E42E0077024E /* loader.gif in Resources */ = {isa = PBXBuildFile; fileRef = 4B7742461D87E42E0077024E /* loader.gif */; };
 		4B7742471D87E42E0077024E /* loader.gif in Resources */ = {isa = PBXBuildFile; fileRef = 4B7742461D87E42E0077024E /* loader.gif */; };
 		4B7742481D87E42E0077024E /* loader.gif in Resources */ = {isa = PBXBuildFile; fileRef = 4B7742461D87E42E0077024E /* loader.gif */; };
 		4B7742481D87E42E0077024E /* loader.gif in Resources */ = {isa = PBXBuildFile; fileRef = 4B7742461D87E42E0077024E /* loader.gif */; };
@@ -133,6 +135,7 @@
 		277EAE9E2045B52800547CD3 /* InterfaceController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InterfaceController.swift; sourceTree = "<group>"; };
 		277EAE9E2045B52800547CD3 /* InterfaceController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InterfaceController.swift; sourceTree = "<group>"; };
 		277EAE9F2045B52800547CD3 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		277EAE9F2045B52800547CD3 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		277EAEA02045B52800547CD3 /* ExtensionDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = "<group>"; };
 		277EAEA02045B52800547CD3 /* ExtensionDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = "<group>"; };
+		4B1C7A3C21A256E300CE9D31 /* InfinityCollectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfinityCollectionViewController.swift; sourceTree = "<group>"; };
 		4B2944551C3D03880088C3E7 /* Kingfisher-macOS-Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Kingfisher-macOS-Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; };
 		4B2944551C3D03880088C3E7 /* Kingfisher-macOS-Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Kingfisher-macOS-Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; };
 		4B7742461D87E42E0077024E /* loader.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = loader.gif; sourceTree = "<group>"; };
 		4B7742461D87E42E0077024E /* loader.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = loader.gif; sourceTree = "<group>"; };
 		4BCCF3361D5B02F8003387C2 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
 		4BCCF3361D5B02F8003387C2 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
@@ -243,6 +246,14 @@
 			path = "Demo/Kingfisher-watchOS-Demo Extension";
 			path = "Demo/Kingfisher-watchOS-Demo Extension";
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
+		4B1C7A3B21A2568100CE9D31 /* Infinity */ = {
+			isa = PBXGroup;
+			children = (
+				4B1C7A3C21A256E300CE9D31 /* InfinityCollectionViewController.swift */,
+			);
+			path = Infinity;
+			sourceTree = "<group>";
+		};
 		4BCCF3351D5B02F8003387C2 /* Kingfisher-macOS-Demo */ = {
 		4BCCF3351D5B02F8003387C2 /* Kingfisher-macOS-Demo */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -308,6 +319,7 @@
 		D1A1CCA921A1936300263AD8 /* ViewControllers */ = {
 		D1A1CCA921A1936300263AD8 /* ViewControllers */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
+				4B1C7A3B21A2568100CE9D31 /* Infinity */,
 				D1CE1BCE21A19C3F00419000 /* Transitions */,
 				D1CE1BCE21A19C3F00419000 /* Transitions */,
 				D1A1CCAA21A1937100263AD8 /* Normal */,
 				D1A1CCAA21A1937100263AD8 /* Normal */,
 				D1A1CCA221A1879600263AD8 /* MainViewController.swift */,
 				D1A1CCA221A1879600263AD8 /* MainViewController.swift */,
@@ -590,6 +602,7 @@
 				D12E0CB61C47F9C100AC98AD /* NormalLoadingViewController.swift in Sources */,
 				D12E0CB61C47F9C100AC98AD /* NormalLoadingViewController.swift in Sources */,
 				D1A1CCA821A18A3200263AD8 /* UIViewController+KingfisherOperation.swift in Sources */,
 				D1A1CCA821A18A3200263AD8 /* UIViewController+KingfisherOperation.swift in Sources */,
 				D12E0CA21C47F92200AC98AD /* AppDelegate.swift in Sources */,
 				D12E0CA21C47F92200AC98AD /* AppDelegate.swift in Sources */,
+				4B1C7A3E21A256E300CE9D31 /* InfinityCollectionViewController.swift in Sources */,
 				D1A1CCA421A1879600263AD8 /* MainViewController.swift in Sources */,
 				D1A1CCA421A1879600263AD8 /* MainViewController.swift in Sources */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
@@ -613,6 +626,7 @@
 				D12E0C981C47F91800AC98AD /* ImageCollectionViewCell.swift in Sources */,
 				D12E0C981C47F91800AC98AD /* ImageCollectionViewCell.swift in Sources */,
 				D1A1CCA721A18A3200263AD8 /* UIViewController+KingfisherOperation.swift in Sources */,
 				D1A1CCA721A18A3200263AD8 /* UIViewController+KingfisherOperation.swift in Sources */,
 				D12E0C951C47F91800AC98AD /* AppDelegate.swift in Sources */,
 				D12E0C951C47F91800AC98AD /* AppDelegate.swift in Sources */,
+				4B1C7A3D21A256E300CE9D31 /* InfinityCollectionViewController.swift in Sources */,
 				D1A1CCA321A1879600263AD8 /* MainViewController.swift in Sources */,
 				D1A1CCA321A1879600263AD8 /* MainViewController.swift in Sources */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;

+ 3 - 3
Sources/Image/Image.swift

@@ -90,13 +90,13 @@ extension KingfisherClass where Base: Image {
     }
     }
     #endif
     #endif
 
 
-    // Bitmap memory cost with KB.
+    // Bitmap memory cost with bytes.
     var cost: Int {
     var cost: Int {
         let pixel = Int(size.width * size.height * scale * scale)
         let pixel = Int(size.width * size.height * scale * scale)
         guard let cgImage = cgImage else {
         guard let cgImage = cgImage else {
-            return pixel * 4 / 1024
+            return pixel * 4
         }
         }
-        return pixel * cgImage.bitsPerPixel / 8 / 1024
+        return pixel * cgImage.bitsPerPixel / 8
     }
     }
 }
 }
 
 

+ 1 - 1
Tests/KingfisherTests/DiskStorageTests.swift

@@ -2,7 +2,7 @@
 //  DiskStorageTests.swift
 //  DiskStorageTests.swift
 //  Kingfisher
 //  Kingfisher
 //
 //
-//  Created by jp20028 on 2018/11/12.
+//  Created by Wei Wang on 2018/11/12.
 //
 //
 //  Copyright (c) 2018年 Wei Wang <onevcat@gmail.com>
 //  Copyright (c) 2018年 Wei Wang <onevcat@gmail.com>
 //
 //

+ 1 - 1
Tests/KingfisherTests/MemoryStorageTests.swift

@@ -2,7 +2,7 @@
 //  MemoryStorageTests.swift
 //  MemoryStorageTests.swift
 //  Kingfisher
 //  Kingfisher
 //
 //
-//  Created by jp20028 on 2018/11/12.
+//  Created by Wei Wang on 2018/11/12.
 //
 //
 //  Copyright (c) 2018年 Wei Wang <onevcat@gmail.com>
 //  Copyright (c) 2018年 Wei Wang <onevcat@gmail.com>
 //
 //