├── .gitignore ├── .travis.yml ├── Example ├── FastKV.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── FastKV-Example.xcscheme ├── FastKV.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── FastKV │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── FKVAppDelegate.h │ ├── FKVAppDelegate.m │ ├── FKVViewController.h │ ├── FKVViewController.m │ ├── FastKV-Info.plist │ ├── FastKV-Prefix.pch │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── en.lproj │ │ └── InfoPlist.strings │ └── main.m ├── Podfile ├── Podfile.lock ├── Pods │ ├── Local Podspecs │ │ └── FastKV.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ └── project.pbxproj │ └── Target Support Files │ │ ├── FastKV │ │ ├── FastKV-dummy.m │ │ ├── FastKV-prefix.pch │ │ ├── FastKV-umbrella.h │ │ ├── FastKV.modulemap │ │ ├── FastKV.xcconfig │ │ └── Info.plist │ │ ├── Pods-FastKV_Example │ │ ├── Info.plist │ │ ├── Pods-FastKV_Example-acknowledgements.markdown │ │ ├── Pods-FastKV_Example-acknowledgements.plist │ │ ├── Pods-FastKV_Example-dummy.m │ │ ├── Pods-FastKV_Example-frameworks.sh │ │ ├── Pods-FastKV_Example-resources.sh │ │ ├── Pods-FastKV_Example-umbrella.h │ │ ├── Pods-FastKV_Example.debug.xcconfig │ │ ├── Pods-FastKV_Example.modulemap │ │ └── Pods-FastKV_Example.release.xcconfig │ │ └── Pods-FastKV_Tests │ │ ├── Info.plist │ │ ├── Pods-FastKV_Tests-acknowledgements.markdown │ │ ├── Pods-FastKV_Tests-acknowledgements.plist │ │ ├── Pods-FastKV_Tests-dummy.m │ │ ├── Pods-FastKV_Tests-frameworks.sh │ │ ├── Pods-FastKV_Tests-resources.sh │ │ ├── Pods-FastKV_Tests-umbrella.h │ │ ├── Pods-FastKV_Tests.debug.xcconfig │ │ ├── Pods-FastKV_Tests.modulemap │ │ └── Pods-FastKV_Tests.release.xcconfig └── Tests │ ├── Tests-Info.plist │ ├── Tests-Prefix.pch │ ├── Tests.m │ └── en.lproj │ └── InfoPlist.strings ├── FastKV.podspec ├── FastKV ├── Assets │ └── .gitkeep └── Classes │ ├── .gitkeep │ ├── FKVPair.h │ ├── FKVPair.m │ ├── FastKV.h │ └── FastKV.m ├── LICENSE ├── README.md ├── _Pods.xcodeproj ├── benchmark.jpeg └── iOS的高性能、高实时性key-value持久化组件.md /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata/ 15 | *.xccheckout 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | Example/Index 22 | 23 | # Bundler 24 | .bundle 25 | 26 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 27 | # Carthage/Checkouts 28 | 29 | Carthage/Build 30 | 31 | # We recommend against adding the Pods directory to your .gitignore. However 32 | # you should judge for yourself, the pros and cons are mentioned at: 33 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 34 | # 35 | # Note: if you ignore the Pods directory, make sure to uncomment 36 | # `pod install` in .travis.yml 37 | # 38 | # Pods/ 39 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # references: 2 | # * https://www.objc.io/issues/6-build-tools/travis-ci/ 3 | # * https://github.com/supermarin/xcpretty#usage 4 | 5 | osx_image: xcode10.2 6 | language: objective-c 7 | # cache: cocoapods 8 | # podfile: Example/Podfile 9 | before_install: 10 | # - gem install cocoapods # Since Travis is not always on latest version 11 | - pod install --project-directory=Example 12 | 13 | script: 14 | - set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/FastKV.xcworkspace -scheme FastKV-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty 15 | - pod lib lint 16 | -------------------------------------------------------------------------------- /Example/FastKV.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 11 | 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58F195388D20070C39A /* CoreGraphics.framework */; }; 12 | 6003F592195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; 13 | 6003F598195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F596195388D20070C39A /* InfoPlist.strings */; }; 14 | 6003F59A195388D20070C39A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F599195388D20070C39A /* main.m */; }; 15 | 6003F59E195388D20070C39A /* FKVAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F59D195388D20070C39A /* FKVAppDelegate.m */; }; 16 | 6003F5A7195388D20070C39A /* FKVViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5A6195388D20070C39A /* FKVViewController.m */; }; 17 | 6003F5A9195388D20070C39A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5A8195388D20070C39A /* Images.xcassets */; }; 18 | 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F5AF195388D20070C39A /* XCTest.framework */; }; 19 | 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 20 | 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; 21 | 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5B8195388D20070C39A /* InfoPlist.strings */; }; 22 | 6003F5BC195388D20070C39A /* Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5BB195388D20070C39A /* Tests.m */; }; 23 | 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */; }; 24 | 873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */; }; 25 | CDE9165D6753C48F91EA1787 /* Pods_FastKV_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F1C740BDE0CA56AED0992923 /* Pods_FastKV_Tests.framework */; }; 26 | DF1FCFE02C5937EFBD7CF4A1 /* Pods_FastKV_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCAB91776045C89E0CA2D0DA /* Pods_FastKV_Example.framework */; }; 27 | /* End PBXBuildFile section */ 28 | 29 | /* Begin PBXContainerItemProxy section */ 30 | 6003F5B3195388D20070C39A /* PBXContainerItemProxy */ = { 31 | isa = PBXContainerItemProxy; 32 | containerPortal = 6003F582195388D10070C39A /* Project object */; 33 | proxyType = 1; 34 | remoteGlobalIDString = 6003F589195388D20070C39A; 35 | remoteInfo = FastKV; 36 | }; 37 | /* End PBXContainerItemProxy section */ 38 | 39 | /* Begin PBXFileReference section */ 40 | 5312BE0EF693B3752925D3E5 /* FastKV.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = FastKV.podspec; path = ../FastKV.podspec; sourceTree = ""; }; 41 | 6003F58A195388D20070C39A /* FastKV_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FastKV_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | 6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 43 | 6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 44 | 6003F591195388D20070C39A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 45 | 6003F595195388D20070C39A /* FastKV-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "FastKV-Info.plist"; sourceTree = ""; }; 46 | 6003F597195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 47 | 6003F599195388D20070C39A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 48 | 6003F59B195388D20070C39A /* FastKV-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "FastKV-Prefix.pch"; sourceTree = ""; }; 49 | 6003F59C195388D20070C39A /* FKVAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FKVAppDelegate.h; sourceTree = ""; }; 50 | 6003F59D195388D20070C39A /* FKVAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FKVAppDelegate.m; sourceTree = ""; }; 51 | 6003F5A5195388D20070C39A /* FKVViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FKVViewController.h; sourceTree = ""; }; 52 | 6003F5A6195388D20070C39A /* FKVViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FKVViewController.m; sourceTree = ""; }; 53 | 6003F5A8195388D20070C39A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 54 | 6003F5AE195388D20070C39A /* FastKV_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FastKV_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 55 | 6003F5AF195388D20070C39A /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 56 | 6003F5B7195388D20070C39A /* Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tests-Info.plist"; sourceTree = ""; }; 57 | 6003F5B9195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 58 | 6003F5BB195388D20070C39A /* Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Tests.m; sourceTree = ""; }; 59 | 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tests-Prefix.pch"; sourceTree = ""; }; 60 | 71719F9E1E33DC2100824A3D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 61 | 7B68AE861BAC49CB81338CFA /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 62 | 85FB6D6F9C1B1684870ECD0F /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 63 | 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Main.storyboard; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 64 | 87C72EAD73A389988A88FD26 /* Pods-FastKV_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FastKV_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-FastKV_Example/Pods-FastKV_Example.debug.xcconfig"; sourceTree = ""; }; 65 | 8DA911F20C5E1EC15F32D413 /* Pods-FastKV_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FastKV_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-FastKV_Tests/Pods-FastKV_Tests.release.xcconfig"; sourceTree = ""; }; 66 | A3F6021AE24A8AC9C37F9EC5 /* Pods-FastKV_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FastKV_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-FastKV_Example/Pods-FastKV_Example.release.xcconfig"; sourceTree = ""; }; 67 | CB2851A1EB5B13DC479B4041 /* Pods-FastKV_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FastKV_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-FastKV_Tests/Pods-FastKV_Tests.debug.xcconfig"; sourceTree = ""; }; 68 | DCAB91776045C89E0CA2D0DA /* Pods_FastKV_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_FastKV_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 69 | F1C740BDE0CA56AED0992923 /* Pods_FastKV_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_FastKV_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 70 | /* End PBXFileReference section */ 71 | 72 | /* Begin PBXFrameworksBuildPhase section */ 73 | 6003F587195388D20070C39A /* Frameworks */ = { 74 | isa = PBXFrameworksBuildPhase; 75 | buildActionMask = 2147483647; 76 | files = ( 77 | 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */, 78 | 6003F592195388D20070C39A /* UIKit.framework in Frameworks */, 79 | 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */, 80 | DF1FCFE02C5937EFBD7CF4A1 /* Pods_FastKV_Example.framework in Frameworks */, 81 | ); 82 | runOnlyForDeploymentPostprocessing = 0; 83 | }; 84 | 6003F5AB195388D20070C39A /* Frameworks */ = { 85 | isa = PBXFrameworksBuildPhase; 86 | buildActionMask = 2147483647; 87 | files = ( 88 | 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */, 89 | 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */, 90 | 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */, 91 | CDE9165D6753C48F91EA1787 /* Pods_FastKV_Tests.framework in Frameworks */, 92 | ); 93 | runOnlyForDeploymentPostprocessing = 0; 94 | }; 95 | /* End PBXFrameworksBuildPhase section */ 96 | 97 | /* Begin PBXGroup section */ 98 | 6003F581195388D10070C39A = { 99 | isa = PBXGroup; 100 | children = ( 101 | 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */, 102 | 6003F593195388D20070C39A /* Example for FastKV */, 103 | 6003F5B5195388D20070C39A /* Tests */, 104 | 6003F58C195388D20070C39A /* Frameworks */, 105 | 6003F58B195388D20070C39A /* Products */, 106 | F028FFD07A49AA58D1D818B5 /* Pods */, 107 | ); 108 | sourceTree = ""; 109 | }; 110 | 6003F58B195388D20070C39A /* Products */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | 6003F58A195388D20070C39A /* FastKV_Example.app */, 114 | 6003F5AE195388D20070C39A /* FastKV_Tests.xctest */, 115 | ); 116 | name = Products; 117 | sourceTree = ""; 118 | }; 119 | 6003F58C195388D20070C39A /* Frameworks */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | 6003F58D195388D20070C39A /* Foundation.framework */, 123 | 6003F58F195388D20070C39A /* CoreGraphics.framework */, 124 | 6003F591195388D20070C39A /* UIKit.framework */, 125 | 6003F5AF195388D20070C39A /* XCTest.framework */, 126 | DCAB91776045C89E0CA2D0DA /* Pods_FastKV_Example.framework */, 127 | F1C740BDE0CA56AED0992923 /* Pods_FastKV_Tests.framework */, 128 | ); 129 | name = Frameworks; 130 | sourceTree = ""; 131 | }; 132 | 6003F593195388D20070C39A /* Example for FastKV */ = { 133 | isa = PBXGroup; 134 | children = ( 135 | 6003F59C195388D20070C39A /* FKVAppDelegate.h */, 136 | 6003F59D195388D20070C39A /* FKVAppDelegate.m */, 137 | 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */, 138 | 6003F5A5195388D20070C39A /* FKVViewController.h */, 139 | 6003F5A6195388D20070C39A /* FKVViewController.m */, 140 | 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */, 141 | 6003F5A8195388D20070C39A /* Images.xcassets */, 142 | 6003F594195388D20070C39A /* Supporting Files */, 143 | ); 144 | name = "Example for FastKV"; 145 | path = FastKV; 146 | sourceTree = ""; 147 | }; 148 | 6003F594195388D20070C39A /* Supporting Files */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | 6003F595195388D20070C39A /* FastKV-Info.plist */, 152 | 6003F596195388D20070C39A /* InfoPlist.strings */, 153 | 6003F599195388D20070C39A /* main.m */, 154 | 6003F59B195388D20070C39A /* FastKV-Prefix.pch */, 155 | ); 156 | name = "Supporting Files"; 157 | sourceTree = ""; 158 | }; 159 | 6003F5B5195388D20070C39A /* Tests */ = { 160 | isa = PBXGroup; 161 | children = ( 162 | 6003F5BB195388D20070C39A /* Tests.m */, 163 | 6003F5B6195388D20070C39A /* Supporting Files */, 164 | ); 165 | path = Tests; 166 | sourceTree = ""; 167 | }; 168 | 6003F5B6195388D20070C39A /* Supporting Files */ = { 169 | isa = PBXGroup; 170 | children = ( 171 | 6003F5B7195388D20070C39A /* Tests-Info.plist */, 172 | 6003F5B8195388D20070C39A /* InfoPlist.strings */, 173 | 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */, 174 | ); 175 | name = "Supporting Files"; 176 | sourceTree = ""; 177 | }; 178 | 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */ = { 179 | isa = PBXGroup; 180 | children = ( 181 | 5312BE0EF693B3752925D3E5 /* FastKV.podspec */, 182 | 85FB6D6F9C1B1684870ECD0F /* README.md */, 183 | 7B68AE861BAC49CB81338CFA /* LICENSE */, 184 | ); 185 | name = "Podspec Metadata"; 186 | sourceTree = ""; 187 | }; 188 | F028FFD07A49AA58D1D818B5 /* Pods */ = { 189 | isa = PBXGroup; 190 | children = ( 191 | 87C72EAD73A389988A88FD26 /* Pods-FastKV_Example.debug.xcconfig */, 192 | A3F6021AE24A8AC9C37F9EC5 /* Pods-FastKV_Example.release.xcconfig */, 193 | CB2851A1EB5B13DC479B4041 /* Pods-FastKV_Tests.debug.xcconfig */, 194 | 8DA911F20C5E1EC15F32D413 /* Pods-FastKV_Tests.release.xcconfig */, 195 | ); 196 | name = Pods; 197 | sourceTree = ""; 198 | }; 199 | /* End PBXGroup section */ 200 | 201 | /* Begin PBXNativeTarget section */ 202 | 6003F589195388D20070C39A /* FastKV_Example */ = { 203 | isa = PBXNativeTarget; 204 | buildConfigurationList = 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "FastKV_Example" */; 205 | buildPhases = ( 206 | 4E69236152B2D1D869248404 /* [CP] Check Pods Manifest.lock */, 207 | 6003F586195388D20070C39A /* Sources */, 208 | 6003F587195388D20070C39A /* Frameworks */, 209 | 6003F588195388D20070C39A /* Resources */, 210 | F1447DA78C55C597B0D56868 /* [CP] Embed Pods Frameworks */, 211 | ); 212 | buildRules = ( 213 | ); 214 | dependencies = ( 215 | ); 216 | name = FastKV_Example; 217 | productName = FastKV; 218 | productReference = 6003F58A195388D20070C39A /* FastKV_Example.app */; 219 | productType = "com.apple.product-type.application"; 220 | }; 221 | 6003F5AD195388D20070C39A /* FastKV_Tests */ = { 222 | isa = PBXNativeTarget; 223 | buildConfigurationList = 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "FastKV_Tests" */; 224 | buildPhases = ( 225 | E17E3E248C01891AEF8E0481 /* [CP] Check Pods Manifest.lock */, 226 | 6003F5AA195388D20070C39A /* Sources */, 227 | 6003F5AB195388D20070C39A /* Frameworks */, 228 | 6003F5AC195388D20070C39A /* Resources */, 229 | ); 230 | buildRules = ( 231 | ); 232 | dependencies = ( 233 | 6003F5B4195388D20070C39A /* PBXTargetDependency */, 234 | ); 235 | name = FastKV_Tests; 236 | productName = FastKVTests; 237 | productReference = 6003F5AE195388D20070C39A /* FastKV_Tests.xctest */; 238 | productType = "com.apple.product-type.bundle.unit-test"; 239 | }; 240 | /* End PBXNativeTarget section */ 241 | 242 | /* Begin PBXProject section */ 243 | 6003F582195388D10070C39A /* Project object */ = { 244 | isa = PBXProject; 245 | attributes = { 246 | CLASSPREFIX = FKV; 247 | KnownAssetTags = ( 248 | 1, 249 | ); 250 | LastUpgradeCheck = 0720; 251 | ORGANIZATIONNAME = yao.li; 252 | TargetAttributes = { 253 | 6003F589195388D20070C39A = { 254 | DevelopmentTeam = 88XD449ZEP; 255 | }; 256 | 6003F5AD195388D20070C39A = { 257 | TestTargetID = 6003F589195388D20070C39A; 258 | }; 259 | }; 260 | }; 261 | buildConfigurationList = 6003F585195388D10070C39A /* Build configuration list for PBXProject "FastKV" */; 262 | compatibilityVersion = "Xcode 3.2"; 263 | developmentRegion = English; 264 | hasScannedForEncodings = 0; 265 | knownRegions = ( 266 | en, 267 | Base, 268 | ); 269 | mainGroup = 6003F581195388D10070C39A; 270 | productRefGroup = 6003F58B195388D20070C39A /* Products */; 271 | projectDirPath = ""; 272 | projectRoot = ""; 273 | targets = ( 274 | 6003F589195388D20070C39A /* FastKV_Example */, 275 | 6003F5AD195388D20070C39A /* FastKV_Tests */, 276 | ); 277 | }; 278 | /* End PBXProject section */ 279 | 280 | /* Begin PBXResourcesBuildPhase section */ 281 | 6003F588195388D20070C39A /* Resources */ = { 282 | isa = PBXResourcesBuildPhase; 283 | buildActionMask = 2147483647; 284 | files = ( 285 | 873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */, 286 | 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */, 287 | 6003F5A9195388D20070C39A /* Images.xcassets in Resources */, 288 | 6003F598195388D20070C39A /* InfoPlist.strings in Resources */, 289 | ); 290 | runOnlyForDeploymentPostprocessing = 0; 291 | }; 292 | 6003F5AC195388D20070C39A /* Resources */ = { 293 | isa = PBXResourcesBuildPhase; 294 | buildActionMask = 2147483647; 295 | files = ( 296 | 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */, 297 | ); 298 | runOnlyForDeploymentPostprocessing = 0; 299 | }; 300 | /* End PBXResourcesBuildPhase section */ 301 | 302 | /* Begin PBXShellScriptBuildPhase section */ 303 | 4E69236152B2D1D869248404 /* [CP] Check Pods Manifest.lock */ = { 304 | isa = PBXShellScriptBuildPhase; 305 | buildActionMask = 2147483647; 306 | files = ( 307 | ); 308 | inputPaths = ( 309 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 310 | "${PODS_ROOT}/Manifest.lock", 311 | ); 312 | name = "[CP] Check Pods Manifest.lock"; 313 | outputPaths = ( 314 | "$(DERIVED_FILE_DIR)/Pods-FastKV_Example-checkManifestLockResult.txt", 315 | ); 316 | runOnlyForDeploymentPostprocessing = 0; 317 | shellPath = /bin/sh; 318 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 319 | showEnvVarsInLog = 0; 320 | }; 321 | E17E3E248C01891AEF8E0481 /* [CP] Check Pods Manifest.lock */ = { 322 | isa = PBXShellScriptBuildPhase; 323 | buildActionMask = 2147483647; 324 | files = ( 325 | ); 326 | inputPaths = ( 327 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 328 | "${PODS_ROOT}/Manifest.lock", 329 | ); 330 | name = "[CP] Check Pods Manifest.lock"; 331 | outputPaths = ( 332 | "$(DERIVED_FILE_DIR)/Pods-FastKV_Tests-checkManifestLockResult.txt", 333 | ); 334 | runOnlyForDeploymentPostprocessing = 0; 335 | shellPath = /bin/sh; 336 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 337 | showEnvVarsInLog = 0; 338 | }; 339 | F1447DA78C55C597B0D56868 /* [CP] Embed Pods Frameworks */ = { 340 | isa = PBXShellScriptBuildPhase; 341 | buildActionMask = 2147483647; 342 | files = ( 343 | ); 344 | inputPaths = ( 345 | "${SRCROOT}/Pods/Target Support Files/Pods-FastKV_Example/Pods-FastKV_Example-frameworks.sh", 346 | "${BUILT_PRODUCTS_DIR}/FastKV/FastKV.framework", 347 | ); 348 | name = "[CP] Embed Pods Frameworks"; 349 | outputPaths = ( 350 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FastKV.framework", 351 | ); 352 | runOnlyForDeploymentPostprocessing = 0; 353 | shellPath = /bin/sh; 354 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-FastKV_Example/Pods-FastKV_Example-frameworks.sh\"\n"; 355 | showEnvVarsInLog = 0; 356 | }; 357 | /* End PBXShellScriptBuildPhase section */ 358 | 359 | /* Begin PBXSourcesBuildPhase section */ 360 | 6003F586195388D20070C39A /* Sources */ = { 361 | isa = PBXSourcesBuildPhase; 362 | buildActionMask = 2147483647; 363 | files = ( 364 | 6003F59E195388D20070C39A /* FKVAppDelegate.m in Sources */, 365 | 6003F5A7195388D20070C39A /* FKVViewController.m in Sources */, 366 | 6003F59A195388D20070C39A /* main.m in Sources */, 367 | ); 368 | runOnlyForDeploymentPostprocessing = 0; 369 | }; 370 | 6003F5AA195388D20070C39A /* Sources */ = { 371 | isa = PBXSourcesBuildPhase; 372 | buildActionMask = 2147483647; 373 | files = ( 374 | 6003F5BC195388D20070C39A /* Tests.m in Sources */, 375 | ); 376 | runOnlyForDeploymentPostprocessing = 0; 377 | }; 378 | /* End PBXSourcesBuildPhase section */ 379 | 380 | /* Begin PBXTargetDependency section */ 381 | 6003F5B4195388D20070C39A /* PBXTargetDependency */ = { 382 | isa = PBXTargetDependency; 383 | target = 6003F589195388D20070C39A /* FastKV_Example */; 384 | targetProxy = 6003F5B3195388D20070C39A /* PBXContainerItemProxy */; 385 | }; 386 | /* End PBXTargetDependency section */ 387 | 388 | /* Begin PBXVariantGroup section */ 389 | 6003F596195388D20070C39A /* InfoPlist.strings */ = { 390 | isa = PBXVariantGroup; 391 | children = ( 392 | 6003F597195388D20070C39A /* en */, 393 | ); 394 | name = InfoPlist.strings; 395 | sourceTree = ""; 396 | }; 397 | 6003F5B8195388D20070C39A /* InfoPlist.strings */ = { 398 | isa = PBXVariantGroup; 399 | children = ( 400 | 6003F5B9195388D20070C39A /* en */, 401 | ); 402 | name = InfoPlist.strings; 403 | sourceTree = ""; 404 | }; 405 | 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */ = { 406 | isa = PBXVariantGroup; 407 | children = ( 408 | 71719F9E1E33DC2100824A3D /* Base */, 409 | ); 410 | name = LaunchScreen.storyboard; 411 | sourceTree = ""; 412 | }; 413 | /* End PBXVariantGroup section */ 414 | 415 | /* Begin XCBuildConfiguration section */ 416 | 6003F5BD195388D20070C39A /* Debug */ = { 417 | isa = XCBuildConfiguration; 418 | buildSettings = { 419 | ALWAYS_SEARCH_USER_PATHS = NO; 420 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 421 | CLANG_CXX_LIBRARY = "libc++"; 422 | CLANG_ENABLE_MODULES = YES; 423 | CLANG_ENABLE_OBJC_ARC = YES; 424 | CLANG_WARN_BOOL_CONVERSION = YES; 425 | CLANG_WARN_CONSTANT_CONVERSION = YES; 426 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 427 | CLANG_WARN_EMPTY_BODY = YES; 428 | CLANG_WARN_ENUM_CONVERSION = YES; 429 | CLANG_WARN_INT_CONVERSION = YES; 430 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 431 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 432 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 433 | COPY_PHASE_STRIP = NO; 434 | ENABLE_TESTABILITY = YES; 435 | GCC_C_LANGUAGE_STANDARD = gnu99; 436 | GCC_DYNAMIC_NO_PIC = NO; 437 | GCC_OPTIMIZATION_LEVEL = 0; 438 | GCC_PREPROCESSOR_DEFINITIONS = ( 439 | "DEBUG=1", 440 | "$(inherited)", 441 | ); 442 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 443 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 444 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 445 | GCC_WARN_UNDECLARED_SELECTOR = YES; 446 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 447 | GCC_WARN_UNUSED_FUNCTION = YES; 448 | GCC_WARN_UNUSED_VARIABLE = YES; 449 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 450 | ONLY_ACTIVE_ARCH = YES; 451 | SDKROOT = iphoneos; 452 | TARGETED_DEVICE_FAMILY = "1,2"; 453 | }; 454 | name = Debug; 455 | }; 456 | 6003F5BE195388D20070C39A /* Release */ = { 457 | isa = XCBuildConfiguration; 458 | buildSettings = { 459 | ALWAYS_SEARCH_USER_PATHS = NO; 460 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 461 | CLANG_CXX_LIBRARY = "libc++"; 462 | CLANG_ENABLE_MODULES = YES; 463 | CLANG_ENABLE_OBJC_ARC = YES; 464 | CLANG_WARN_BOOL_CONVERSION = YES; 465 | CLANG_WARN_CONSTANT_CONVERSION = YES; 466 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 467 | CLANG_WARN_EMPTY_BODY = YES; 468 | CLANG_WARN_ENUM_CONVERSION = YES; 469 | CLANG_WARN_INT_CONVERSION = YES; 470 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 471 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 472 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 473 | COPY_PHASE_STRIP = YES; 474 | ENABLE_NS_ASSERTIONS = NO; 475 | GCC_C_LANGUAGE_STANDARD = gnu99; 476 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 477 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 478 | GCC_WARN_UNDECLARED_SELECTOR = YES; 479 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 480 | GCC_WARN_UNUSED_FUNCTION = YES; 481 | GCC_WARN_UNUSED_VARIABLE = YES; 482 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 483 | SDKROOT = iphoneos; 484 | TARGETED_DEVICE_FAMILY = "1,2"; 485 | VALIDATE_PRODUCT = YES; 486 | }; 487 | name = Release; 488 | }; 489 | 6003F5C0195388D20070C39A /* Debug */ = { 490 | isa = XCBuildConfiguration; 491 | baseConfigurationReference = 87C72EAD73A389988A88FD26 /* Pods-FastKV_Example.debug.xcconfig */; 492 | buildSettings = { 493 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 494 | DEVELOPMENT_TEAM = 88XD449ZEP; 495 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 496 | GCC_PREFIX_HEADER = "FastKV/FastKV-Prefix.pch"; 497 | INFOPLIST_FILE = "FastKV/FastKV-Info.plist"; 498 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 499 | MODULE_NAME = ExampleApp; 500 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 501 | PRODUCT_NAME = "$(TARGET_NAME)"; 502 | WRAPPER_EXTENSION = app; 503 | }; 504 | name = Debug; 505 | }; 506 | 6003F5C1195388D20070C39A /* Release */ = { 507 | isa = XCBuildConfiguration; 508 | baseConfigurationReference = A3F6021AE24A8AC9C37F9EC5 /* Pods-FastKV_Example.release.xcconfig */; 509 | buildSettings = { 510 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 511 | DEVELOPMENT_TEAM = 88XD449ZEP; 512 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 513 | GCC_PREFIX_HEADER = "FastKV/FastKV-Prefix.pch"; 514 | INFOPLIST_FILE = "FastKV/FastKV-Info.plist"; 515 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 516 | MODULE_NAME = ExampleApp; 517 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 518 | PRODUCT_NAME = "$(TARGET_NAME)"; 519 | WRAPPER_EXTENSION = app; 520 | }; 521 | name = Release; 522 | }; 523 | 6003F5C3195388D20070C39A /* Debug */ = { 524 | isa = XCBuildConfiguration; 525 | baseConfigurationReference = CB2851A1EB5B13DC479B4041 /* Pods-FastKV_Tests.debug.xcconfig */; 526 | buildSettings = { 527 | BUNDLE_LOADER = "$(TEST_HOST)"; 528 | FRAMEWORK_SEARCH_PATHS = ( 529 | "$(SDKROOT)/Developer/Library/Frameworks", 530 | "$(inherited)", 531 | "$(DEVELOPER_FRAMEWORKS_DIR)", 532 | ); 533 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 534 | GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; 535 | GCC_PREPROCESSOR_DEFINITIONS = ( 536 | "DEBUG=1", 537 | "$(inherited)", 538 | ); 539 | INFOPLIST_FILE = "Tests/Tests-Info.plist"; 540 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 541 | PRODUCT_NAME = "$(TARGET_NAME)"; 542 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/FastKV_Example.app/FastKV_Example"; 543 | WRAPPER_EXTENSION = xctest; 544 | }; 545 | name = Debug; 546 | }; 547 | 6003F5C4195388D20070C39A /* Release */ = { 548 | isa = XCBuildConfiguration; 549 | baseConfigurationReference = 8DA911F20C5E1EC15F32D413 /* Pods-FastKV_Tests.release.xcconfig */; 550 | buildSettings = { 551 | BUNDLE_LOADER = "$(TEST_HOST)"; 552 | FRAMEWORK_SEARCH_PATHS = ( 553 | "$(SDKROOT)/Developer/Library/Frameworks", 554 | "$(inherited)", 555 | "$(DEVELOPER_FRAMEWORKS_DIR)", 556 | ); 557 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 558 | GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; 559 | INFOPLIST_FILE = "Tests/Tests-Info.plist"; 560 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 561 | PRODUCT_NAME = "$(TARGET_NAME)"; 562 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/FastKV_Example.app/FastKV_Example"; 563 | WRAPPER_EXTENSION = xctest; 564 | }; 565 | name = Release; 566 | }; 567 | /* End XCBuildConfiguration section */ 568 | 569 | /* Begin XCConfigurationList section */ 570 | 6003F585195388D10070C39A /* Build configuration list for PBXProject "FastKV" */ = { 571 | isa = XCConfigurationList; 572 | buildConfigurations = ( 573 | 6003F5BD195388D20070C39A /* Debug */, 574 | 6003F5BE195388D20070C39A /* Release */, 575 | ); 576 | defaultConfigurationIsVisible = 0; 577 | defaultConfigurationName = Release; 578 | }; 579 | 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "FastKV_Example" */ = { 580 | isa = XCConfigurationList; 581 | buildConfigurations = ( 582 | 6003F5C0195388D20070C39A /* Debug */, 583 | 6003F5C1195388D20070C39A /* Release */, 584 | ); 585 | defaultConfigurationIsVisible = 0; 586 | defaultConfigurationName = Release; 587 | }; 588 | 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "FastKV_Tests" */ = { 589 | isa = XCConfigurationList; 590 | buildConfigurations = ( 591 | 6003F5C3195388D20070C39A /* Debug */, 592 | 6003F5C4195388D20070C39A /* Release */, 593 | ); 594 | defaultConfigurationIsVisible = 0; 595 | defaultConfigurationName = Release; 596 | }; 597 | /* End XCConfigurationList section */ 598 | }; 599 | rootObject = 6003F582195388D10070C39A /* Project object */; 600 | } 601 | -------------------------------------------------------------------------------- /Example/FastKV.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/FastKV.xcodeproj/xcshareddata/xcschemes/FastKV-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 85 | 91 | 92 | 93 | 94 | 96 | 97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /Example/FastKV.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/FastKV.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/FastKV/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Example/FastKV/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 39 | 54 | 66 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /Example/FastKV/FKVAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // FKVAppDelegate.h 3 | // FastKV 4 | // 5 | // Created by yao.li on 08/09/2018. 6 | // Copyright (c) 2018 yao.li. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | @interface FKVAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Example/FastKV/FKVAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // FKVAppDelegate.m 3 | // FastKV 4 | // 5 | // Created by yao.li on 08/09/2018. 6 | // Copyright (c) 2018 yao.li. All rights reserved. 7 | // 8 | 9 | #import "FKVAppDelegate.h" 10 | 11 | @implementation FKVAppDelegate 12 | 13 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 14 | { 15 | // Override point for customization after application launch. 16 | return YES; 17 | } 18 | 19 | - (void)applicationWillResignActive:(UIApplication *)application 20 | { 21 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 22 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 23 | } 24 | 25 | - (void)applicationDidEnterBackground:(UIApplication *)application 26 | { 27 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 28 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 29 | } 30 | 31 | - (void)applicationWillEnterForeground:(UIApplication *)application 32 | { 33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | - (void)applicationDidBecomeActive:(UIApplication *)application 37 | { 38 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 39 | } 40 | 41 | - (void)applicationWillTerminate:(UIApplication *)application 42 | { 43 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 44 | } 45 | 46 | @end 47 | -------------------------------------------------------------------------------- /Example/FastKV/FKVViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // FKVViewController.h 3 | // FastKV 4 | // 5 | // Created by yao.li on 08/09/2018. 6 | // Copyright (c) 2018 yao.li. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | @interface FKVViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/FastKV/FKVViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // FKVViewController.m 3 | // FastKV 4 | // 5 | // Created by yao.li on 08/09/2018. 6 | // Copyright (c) 2018 yao.li. All rights reserved. 7 | // 8 | 9 | #import "FKVViewController.h" 10 | #import 11 | #import 12 | 13 | @interface FKVViewController () 14 | 15 | @end 16 | 17 | @implementation FKVViewController 18 | 19 | - (void)viewDidLoad 20 | { 21 | [super viewDidLoad]; 22 | [self test]; 23 | } 24 | 25 | - (void)didReceiveMemoryWarning 26 | { 27 | [super didReceiveMemoryWarning]; 28 | // Dispose of any resources that can be recreated. 29 | } 30 | 31 | - (void)test { 32 | // [[FastKV defaultFastKV] removeAllKeys]; 33 | // [self resetDefaults]; 34 | 35 | FKVPair *fkp = [[FKVPair alloc] init]; 36 | fkp.valueType = FKVPairTypeData; 37 | fkp.objcType = @"NSString"; 38 | fkp.key = @"testlytestlytestlytestly"; 39 | fkp.stringVal = @"sss"; 40 | NSData *numberData = [NSKeyedArchiver archivedDataWithRootObject:@1]; 41 | fkp.binaryVal = numberData; 42 | 43 | NSData *data = [fkp representationData]; 44 | 45 | FKVPair *pair = [FKVPair parseFromData:data error:nil]; 46 | NSLog(@"%@", pair); 47 | } 48 | 49 | uint64_t dispatch_benchmark(size_t count, void (^block)(void)); 50 | 51 | - (IBAction)eventFromButton:(UIButton *)sender { 52 | NSMutableArray *keyArray = [NSMutableArray array]; 53 | NSMutableArray *valueArray = [NSMutableArray array]; 54 | for (int i=0; i<10000; i++) { 55 | [keyArray addObject:[NSString stringWithFormat:@"testfkv%@", @(i)]]; 56 | // [valueArray addObject:[NSString stringWithFormat:@"value%ud", arc4random()]]; 57 | [valueArray addObject:@(arc4random())]; 58 | } 59 | if (sender.tag == 1) { 60 | __block int i = 0; 61 | uint64_t time = dispatch_benchmark(10000, ^{ 62 | [[FastKV defaultFastKV] setInteger:[valueArray[i] integerValue] forKey:keyArray[i++]]; 63 | // [[FastKV defaultFastKV] setObject:valueArray[i] forKey:keyArray[i++]]; 64 | }); 65 | NSLog(@"FastKV %@ms", @(time * 10000 / 1000000)); 66 | 67 | } else if (sender.tag == 2) { 68 | __block int i = 0; 69 | uint64_t time = dispatch_benchmark(10000, ^{ 70 | [[FastKV defaultFastKV] integerForKey:keyArray[i++]]; 71 | 72 | // [[NSUserDefaults standardUserDefaults] integerForKey:keyArray[i++]]; 73 | }); 74 | NSLog(@"Get FastKV %@ms", @(time * 10000 / 1000000)); 75 | } else if (sender.tag == 3) { 76 | [[FastKV defaultFastKV] removeObjectForKey:@"testfkv4800"]; 77 | } else if (sender.tag == 4) { 78 | [[FastKV defaultFastKV] cleanUp]; 79 | __block int i = 0; 80 | uint64_t time = dispatch_benchmark(10000, ^{ 81 | [[NSUserDefaults standardUserDefaults] setInteger:[valueArray[i] integerValue] forKey:keyArray[i++]]; 82 | // [[NSUserDefaults standardUserDefaults] setObject:valueArray[i] forKey:keyArray[i++]]; 83 | [[NSUserDefaults standardUserDefaults] synchronize]; 84 | }); 85 | NSLog(@"NSUserDefaults %@ms", @(time * 10000 / 1000000)); 86 | } 87 | } 88 | 89 | 90 | - (void)resetDefaults { 91 | NSUserDefaults * defs = [NSUserDefaults standardUserDefaults]; 92 | NSDictionary * dict = [defs dictionaryRepresentation]; 93 | for (id key in dict) { 94 | [defs removeObjectForKey:key]; 95 | } 96 | [defs synchronize]; 97 | } 98 | 99 | - (void)logTimeTakenToRunBlock:(void(^)(void))block withPrefix:(NSString *)prefixString { 100 | 101 | double a = CFAbsoluteTimeGetCurrent(); 102 | block(); 103 | double b = CFAbsoluteTimeGetCurrent(); 104 | 105 | unsigned long m = ((b-a) * 1000000.0f); // convert from seconds to milliseconds 106 | 107 | NSLog(@"fkv %@: %lu ms", prefixString ? prefixString : @"Time taken", m); 108 | } 109 | @end 110 | -------------------------------------------------------------------------------- /Example/FastKV/FastKV-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UIRequiredDeviceCapabilities 32 | 33 | armv7 34 | 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationLandscapeLeft 39 | UIInterfaceOrientationLandscapeRight 40 | 41 | UISupportedInterfaceOrientations~ipad 42 | 43 | UIInterfaceOrientationPortrait 44 | UIInterfaceOrientationPortraitUpsideDown 45 | UIInterfaceOrientationLandscapeLeft 46 | UIInterfaceOrientationLandscapeRight 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /Example/FastKV/FastKV-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #import 8 | 9 | #ifndef __IPHONE_5_0 10 | #warning "This project uses features only available in iOS SDK 5.0 and later." 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | @import UIKit; 15 | @import Foundation; 16 | #endif 17 | -------------------------------------------------------------------------------- /Example/FastKV/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /Example/FastKV/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Example/FastKV/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // FastKV 4 | // 5 | // Created by yao.li on 08/09/2018. 6 | // Copyright (c) 2018 yao.li. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | #import "FKVAppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) 13 | { 14 | @autoreleasepool { 15 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([FKVAppDelegate class])); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | target 'FastKV_Example' do 4 | pod 'FastKV', :path => '../' 5 | 6 | target 'FastKV_Tests' do 7 | inherit! :search_paths 8 | 9 | 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - FastKV (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - FastKV (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | FastKV: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | FastKV: ca00892610127f4334849ff15919c9f3e8590e5b 13 | 14 | PODFILE CHECKSUM: 74718634bab5c002387b1dc38c56311fa7207616 15 | 16 | COCOAPODS: 1.5.3 17 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/FastKV.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "FastKV", 3 | "version": "0.1.0", 4 | "summary": "A short description of FastKV.", 5 | "description": "TODO: Add long description of the pod here.", 6 | "homepage": "https://github.com/yao.li/FastKV", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "yao.li": "yao.li@cootek.cn" 13 | }, 14 | "source": { 15 | "git": "https://github.com/yao.li/FastKV.git", 16 | "tag": "0.1.0" 17 | }, 18 | "platforms": { 19 | "ios": "8.0" 20 | }, 21 | "source_files": "FastKV/Classes/**/*" 22 | } 23 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - FastKV (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - FastKV (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | FastKV: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | FastKV: ca00892610127f4334849ff15919c9f3e8590e5b 13 | 14 | PODFILE CHECKSUM: 74718634bab5c002387b1dc38c56311fa7207616 15 | 16 | COCOAPODS: 1.5.3 17 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1B5064D697137CCB8234B84F3504EE74 /* FKVPair.h in Headers */ = {isa = PBXBuildFile; fileRef = A55D48D6E03150A7BA3BF05C61B6B670 /* FKVPair.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 327D4A3E72D30B5202A6AA25BE0310F1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; 12 | 4D7E22579AA9AAE49EECAC4C1DE03F14 /* Pods-FastKV_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 33731FFEE3B41AB9DCA313EEEDB92933 /* Pods-FastKV_Tests-dummy.m */; }; 13 | 4F7818EC0AB26FBB16BD69976E00315B /* FastKV.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BE1B8B3D4CCDF964F3D737A78CE5E79 /* FastKV.h */; settings = {ATTRIBUTES = (Public, ); }; }; 14 | 6DD2F41CA8529120EF928D996C64FC25 /* FastKV.m in Sources */ = {isa = PBXBuildFile; fileRef = C5269B9878A5C083574ABD808B8BDC24 /* FastKV.m */; }; 15 | 95E3C2FBAB2F9CF2B46B1B90471AFFF6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; 16 | 96730D74ADD11E6A6D0A72F6E7D60F01 /* FKVPair.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A7507AD774814BEFF96FA0701D60500 /* FKVPair.m */; }; 17 | B87E58A864D85F95AAF9453E6CE96172 /* Pods-FastKV_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D383F96FB5EFA0E6A632A798FA1B2B6 /* Pods-FastKV_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18 | B9539DA3F4986F3C34B1574E44052AEF /* Pods-FastKV_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A6D6D582D1521AFD4CCFBF8344AAA486 /* Pods-FastKV_Example-dummy.m */; }; 19 | C14CD2BBBC1AFA93BC31D75C2B633752 /* Pods-FastKV_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 94EEC2A13FB79ED2715FC0D4E447D7E0 /* Pods-FastKV_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 20 | E53E6E39AA2EED438998133972B15ADB /* FastKV-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 803415B6E3683A168808D7A6F6A4A148 /* FastKV-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 21 | ED8DAC34E9E7061B2142B99186B7407A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; 22 | F232BB7D20157335ACBF9E4A02AED6B5 /* FastKV-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E8CAB63E9A8BE887BFFB252E1136E27B /* FastKV-dummy.m */; }; 23 | /* End PBXBuildFile section */ 24 | 25 | /* Begin PBXContainerItemProxy section */ 26 | 76A87B0DE6C02201548E4F165A055781 /* PBXContainerItemProxy */ = { 27 | isa = PBXContainerItemProxy; 28 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 29 | proxyType = 1; 30 | remoteGlobalIDString = F7AC65154BDB495AAF14C36F346648DD; 31 | remoteInfo = FastKV; 32 | }; 33 | B7FC108EBD14B4FFFA2DD4C8339A738A /* PBXContainerItemProxy */ = { 34 | isa = PBXContainerItemProxy; 35 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 36 | proxyType = 1; 37 | remoteGlobalIDString = 3AB8F632BF73068EE2A5E31FD2D74DB4; 38 | remoteInfo = "Pods-FastKV_Example"; 39 | }; 40 | /* End PBXContainerItemProxy section */ 41 | 42 | /* Begin PBXFileReference section */ 43 | 0C32537B4EE2359BFE65B80EC3C833B3 /* Pods-FastKV_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-FastKV_Example.modulemap"; sourceTree = ""; }; 44 | 0E6953D3178EB008B9E27509BF6938F2 /* FastKV.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = FastKV.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 45 | 1A9D67DADCDA9610EB424D1200B68C39 /* FastKV.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FastKV.modulemap; sourceTree = ""; }; 46 | 1B44403136BF4CCCFB435E3FD43485E8 /* Pods-FastKV_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-FastKV_Example-acknowledgements.plist"; sourceTree = ""; }; 47 | 1D383F96FB5EFA0E6A632A798FA1B2B6 /* Pods-FastKV_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-FastKV_Example-umbrella.h"; sourceTree = ""; }; 48 | 1FC57C745BDDC41EF5B9C7C059D59899 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 49 | 20A2E7261B36494151462CD80EDACEC6 /* Pods_FastKV_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_FastKV_Example.framework; path = "Pods-FastKV_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 50 | 268FE23945042E91C2BB70D4FD6118BF /* Pods-FastKV_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-FastKV_Tests-acknowledgements.plist"; sourceTree = ""; }; 51 | 33731FFEE3B41AB9DCA313EEEDB92933 /* Pods-FastKV_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-FastKV_Tests-dummy.m"; sourceTree = ""; }; 52 | 34D4F9B36D1119388914AD02167D8E5A /* Pods_FastKV_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_FastKV_Tests.framework; path = "Pods-FastKV_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | 39E3C671FED15503ECBB27B2A9A4F8BD /* Pods-FastKV_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-FastKV_Example.debug.xcconfig"; sourceTree = ""; }; 54 | 3CCEDF82F7BDD56DC21CFB2645CAF25E /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; 55 | 500410E021DF1F546CD59AD02C98D523 /* FastKV.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FastKV.xcconfig; sourceTree = ""; }; 56 | 51E12C54477C0B69EC7D675DD5A13429 /* Pods-FastKV_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-FastKV_Example-acknowledgements.markdown"; sourceTree = ""; }; 57 | 58983E51498DE6897B98E99A3F599E8F /* Pods-FastKV_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-FastKV_Example-frameworks.sh"; sourceTree = ""; }; 58 | 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 59 | 69EE7E3DACD6D5244210FC0602F7A9EE /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; 60 | 7201AFDB5CA777E17CF9EFEA2A825607 /* Pods-FastKV_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-FastKV_Tests-frameworks.sh"; sourceTree = ""; }; 61 | 741867BE392B67D599C012F274C811CD /* Pods-FastKV_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-FastKV_Example.release.xcconfig"; sourceTree = ""; }; 62 | 7A7507AD774814BEFF96FA0701D60500 /* FKVPair.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FKVPair.m; path = FastKV/Classes/FKVPair.m; sourceTree = ""; }; 63 | 803415B6E3683A168808D7A6F6A4A148 /* FastKV-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FastKV-umbrella.h"; sourceTree = ""; }; 64 | 87C48E7BF0F5CAB2156F8BA30EFDB3EE /* Pods-FastKV_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-FastKV_Tests-acknowledgements.markdown"; sourceTree = ""; }; 65 | 8BE1B8B3D4CCDF964F3D737A78CE5E79 /* FastKV.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FastKV.h; path = FastKV/Classes/FastKV.h; sourceTree = ""; }; 66 | 8D979DDCE944840EDEA80988A1F929AE /* Pods-FastKV_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-FastKV_Tests.modulemap"; sourceTree = ""; }; 67 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 68 | 94EEC2A13FB79ED2715FC0D4E447D7E0 /* Pods-FastKV_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-FastKV_Tests-umbrella.h"; sourceTree = ""; }; 69 | A55D48D6E03150A7BA3BF05C61B6B670 /* FKVPair.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FKVPair.h; path = FastKV/Classes/FKVPair.h; sourceTree = ""; }; 70 | A6D6D582D1521AFD4CCFBF8344AAA486 /* Pods-FastKV_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-FastKV_Example-dummy.m"; sourceTree = ""; }; 71 | B541A90D8F1B03DAE22FC9483FE6A477 /* Pods-FastKV_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-FastKV_Tests-resources.sh"; sourceTree = ""; }; 72 | C5269B9878A5C083574ABD808B8BDC24 /* FastKV.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FastKV.m; path = FastKV/Classes/FastKV.m; sourceTree = ""; }; 73 | CF88C804B64B7AFB1066596C1F4D494F /* Pods-FastKV_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-FastKV_Example-resources.sh"; sourceTree = ""; }; 74 | E8A9B4AF74906401DEAFA6A3599A67ED /* Pods-FastKV_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-FastKV_Tests.debug.xcconfig"; sourceTree = ""; }; 75 | E8CAB63E9A8BE887BFFB252E1136E27B /* FastKV-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FastKV-dummy.m"; sourceTree = ""; }; 76 | EA13AEF135441DD76629DF8403590E4F /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 77 | F441F4F752FF6FBCF61E19ECAB70B2F0 /* FastKV.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FastKV.framework; path = FastKV.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 78 | F4986CB6EAA38B24504B3C3358D48E36 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 79 | F5F4DB0C58B706F4A2812E858ED080F9 /* FastKV-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FastKV-prefix.pch"; sourceTree = ""; }; 80 | FE4B3C83FEF6AEC94324C1328B5A31E6 /* Pods-FastKV_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-FastKV_Tests.release.xcconfig"; sourceTree = ""; }; 81 | /* End PBXFileReference section */ 82 | 83 | /* Begin PBXFrameworksBuildPhase section */ 84 | 0E59AFABBC6DAF8E917D9BB8C0D07B8F /* Frameworks */ = { 85 | isa = PBXFrameworksBuildPhase; 86 | buildActionMask = 2147483647; 87 | files = ( 88 | 327D4A3E72D30B5202A6AA25BE0310F1 /* Foundation.framework in Frameworks */, 89 | ); 90 | runOnlyForDeploymentPostprocessing = 0; 91 | }; 92 | 22F65C787F0B4DC39059FE64813022DB /* Frameworks */ = { 93 | isa = PBXFrameworksBuildPhase; 94 | buildActionMask = 2147483647; 95 | files = ( 96 | ED8DAC34E9E7061B2142B99186B7407A /* Foundation.framework in Frameworks */, 97 | ); 98 | runOnlyForDeploymentPostprocessing = 0; 99 | }; 100 | DAC5F88D59C13249B4A58D5FB8943B28 /* Frameworks */ = { 101 | isa = PBXFrameworksBuildPhase; 102 | buildActionMask = 2147483647; 103 | files = ( 104 | 95E3C2FBAB2F9CF2B46B1B90471AFFF6 /* Foundation.framework in Frameworks */, 105 | ); 106 | runOnlyForDeploymentPostprocessing = 0; 107 | }; 108 | /* End PBXFrameworksBuildPhase section */ 109 | 110 | /* Begin PBXGroup section */ 111 | 12AFB7284997BD8D016411A21EC7B793 /* Development Pods */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | C27CD00D66993236438BA9B5D5A82239 /* FastKV */, 115 | ); 116 | name = "Development Pods"; 117 | sourceTree = ""; 118 | }; 119 | 3CD5A97216D00B0A4CDCF6F91E0DAB6C /* Targets Support Files */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | 8382ABEB49495A5F9C6B9598141BB9B2 /* Pods-FastKV_Example */, 123 | B740D24FDC0FF7A8BD37C95182D93525 /* Pods-FastKV_Tests */, 124 | ); 125 | name = "Targets Support Files"; 126 | sourceTree = ""; 127 | }; 128 | 436A1223E72E5847485E42945F9ABDB4 /* Products */ = { 129 | isa = PBXGroup; 130 | children = ( 131 | F441F4F752FF6FBCF61E19ECAB70B2F0 /* FastKV.framework */, 132 | 20A2E7261B36494151462CD80EDACEC6 /* Pods_FastKV_Example.framework */, 133 | 34D4F9B36D1119388914AD02167D8E5A /* Pods_FastKV_Tests.framework */, 134 | ); 135 | name = Products; 136 | sourceTree = ""; 137 | }; 138 | 7DB346D0F39D3F0E887471402A8071AB = { 139 | isa = PBXGroup; 140 | children = ( 141 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, 142 | 12AFB7284997BD8D016411A21EC7B793 /* Development Pods */, 143 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */, 144 | 436A1223E72E5847485E42945F9ABDB4 /* Products */, 145 | 3CD5A97216D00B0A4CDCF6F91E0DAB6C /* Targets Support Files */, 146 | ); 147 | sourceTree = ""; 148 | }; 149 | 8382ABEB49495A5F9C6B9598141BB9B2 /* Pods-FastKV_Example */ = { 150 | isa = PBXGroup; 151 | children = ( 152 | 1FC57C745BDDC41EF5B9C7C059D59899 /* Info.plist */, 153 | 0C32537B4EE2359BFE65B80EC3C833B3 /* Pods-FastKV_Example.modulemap */, 154 | 51E12C54477C0B69EC7D675DD5A13429 /* Pods-FastKV_Example-acknowledgements.markdown */, 155 | 1B44403136BF4CCCFB435E3FD43485E8 /* Pods-FastKV_Example-acknowledgements.plist */, 156 | A6D6D582D1521AFD4CCFBF8344AAA486 /* Pods-FastKV_Example-dummy.m */, 157 | 58983E51498DE6897B98E99A3F599E8F /* Pods-FastKV_Example-frameworks.sh */, 158 | CF88C804B64B7AFB1066596C1F4D494F /* Pods-FastKV_Example-resources.sh */, 159 | 1D383F96FB5EFA0E6A632A798FA1B2B6 /* Pods-FastKV_Example-umbrella.h */, 160 | 39E3C671FED15503ECBB27B2A9A4F8BD /* Pods-FastKV_Example.debug.xcconfig */, 161 | 741867BE392B67D599C012F274C811CD /* Pods-FastKV_Example.release.xcconfig */, 162 | ); 163 | name = "Pods-FastKV_Example"; 164 | path = "Target Support Files/Pods-FastKV_Example"; 165 | sourceTree = ""; 166 | }; 167 | 8CE3C9DA3F812BC80174063C3B6B37C5 /* Pod */ = { 168 | isa = PBXGroup; 169 | children = ( 170 | 0E6953D3178EB008B9E27509BF6938F2 /* FastKV.podspec */, 171 | 69EE7E3DACD6D5244210FC0602F7A9EE /* LICENSE */, 172 | 3CCEDF82F7BDD56DC21CFB2645CAF25E /* README.md */, 173 | ); 174 | name = Pod; 175 | sourceTree = ""; 176 | }; 177 | 8D57287C57F8B0BBF244CABC4E9708D0 /* Support Files */ = { 178 | isa = PBXGroup; 179 | children = ( 180 | 1A9D67DADCDA9610EB424D1200B68C39 /* FastKV.modulemap */, 181 | 500410E021DF1F546CD59AD02C98D523 /* FastKV.xcconfig */, 182 | E8CAB63E9A8BE887BFFB252E1136E27B /* FastKV-dummy.m */, 183 | F5F4DB0C58B706F4A2812E858ED080F9 /* FastKV-prefix.pch */, 184 | 803415B6E3683A168808D7A6F6A4A148 /* FastKV-umbrella.h */, 185 | F4986CB6EAA38B24504B3C3358D48E36 /* Info.plist */, 186 | ); 187 | name = "Support Files"; 188 | path = "Example/Pods/Target Support Files/FastKV"; 189 | sourceTree = ""; 190 | }; 191 | B740D24FDC0FF7A8BD37C95182D93525 /* Pods-FastKV_Tests */ = { 192 | isa = PBXGroup; 193 | children = ( 194 | EA13AEF135441DD76629DF8403590E4F /* Info.plist */, 195 | 8D979DDCE944840EDEA80988A1F929AE /* Pods-FastKV_Tests.modulemap */, 196 | 87C48E7BF0F5CAB2156F8BA30EFDB3EE /* Pods-FastKV_Tests-acknowledgements.markdown */, 197 | 268FE23945042E91C2BB70D4FD6118BF /* Pods-FastKV_Tests-acknowledgements.plist */, 198 | 33731FFEE3B41AB9DCA313EEEDB92933 /* Pods-FastKV_Tests-dummy.m */, 199 | 7201AFDB5CA777E17CF9EFEA2A825607 /* Pods-FastKV_Tests-frameworks.sh */, 200 | B541A90D8F1B03DAE22FC9483FE6A477 /* Pods-FastKV_Tests-resources.sh */, 201 | 94EEC2A13FB79ED2715FC0D4E447D7E0 /* Pods-FastKV_Tests-umbrella.h */, 202 | E8A9B4AF74906401DEAFA6A3599A67ED /* Pods-FastKV_Tests.debug.xcconfig */, 203 | FE4B3C83FEF6AEC94324C1328B5A31E6 /* Pods-FastKV_Tests.release.xcconfig */, 204 | ); 205 | name = "Pods-FastKV_Tests"; 206 | path = "Target Support Files/Pods-FastKV_Tests"; 207 | sourceTree = ""; 208 | }; 209 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */ = { 210 | isa = PBXGroup; 211 | children = ( 212 | D35AF013A5F0BAD4F32504907A52519E /* iOS */, 213 | ); 214 | name = Frameworks; 215 | sourceTree = ""; 216 | }; 217 | C27CD00D66993236438BA9B5D5A82239 /* FastKV */ = { 218 | isa = PBXGroup; 219 | children = ( 220 | 8BE1B8B3D4CCDF964F3D737A78CE5E79 /* FastKV.h */, 221 | C5269B9878A5C083574ABD808B8BDC24 /* FastKV.m */, 222 | A55D48D6E03150A7BA3BF05C61B6B670 /* FKVPair.h */, 223 | 7A7507AD774814BEFF96FA0701D60500 /* FKVPair.m */, 224 | 8CE3C9DA3F812BC80174063C3B6B37C5 /* Pod */, 225 | 8D57287C57F8B0BBF244CABC4E9708D0 /* Support Files */, 226 | ); 227 | name = FastKV; 228 | path = ../..; 229 | sourceTree = ""; 230 | }; 231 | D35AF013A5F0BAD4F32504907A52519E /* iOS */ = { 232 | isa = PBXGroup; 233 | children = ( 234 | 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */, 235 | ); 236 | name = iOS; 237 | sourceTree = ""; 238 | }; 239 | /* End PBXGroup section */ 240 | 241 | /* Begin PBXHeadersBuildPhase section */ 242 | A8E8201388AB5D83A811E3AAC3078673 /* Headers */ = { 243 | isa = PBXHeadersBuildPhase; 244 | buildActionMask = 2147483647; 245 | files = ( 246 | B87E58A864D85F95AAF9453E6CE96172 /* Pods-FastKV_Example-umbrella.h in Headers */, 247 | ); 248 | runOnlyForDeploymentPostprocessing = 0; 249 | }; 250 | D29F8A17309CC149367D2046E1ACEC71 /* Headers */ = { 251 | isa = PBXHeadersBuildPhase; 252 | buildActionMask = 2147483647; 253 | files = ( 254 | E53E6E39AA2EED438998133972B15ADB /* FastKV-umbrella.h in Headers */, 255 | 4F7818EC0AB26FBB16BD69976E00315B /* FastKV.h in Headers */, 256 | 1B5064D697137CCB8234B84F3504EE74 /* FKVPair.h in Headers */, 257 | ); 258 | runOnlyForDeploymentPostprocessing = 0; 259 | }; 260 | F40C1B441B6F94157F6D3742006471C2 /* Headers */ = { 261 | isa = PBXHeadersBuildPhase; 262 | buildActionMask = 2147483647; 263 | files = ( 264 | C14CD2BBBC1AFA93BC31D75C2B633752 /* Pods-FastKV_Tests-umbrella.h in Headers */, 265 | ); 266 | runOnlyForDeploymentPostprocessing = 0; 267 | }; 268 | /* End PBXHeadersBuildPhase section */ 269 | 270 | /* Begin PBXNativeTarget section */ 271 | 3AB8F632BF73068EE2A5E31FD2D74DB4 /* Pods-FastKV_Example */ = { 272 | isa = PBXNativeTarget; 273 | buildConfigurationList = 4BC62CD8609AF4C5BF1F56ADEE5F5E4D /* Build configuration list for PBXNativeTarget "Pods-FastKV_Example" */; 274 | buildPhases = ( 275 | 261E8D66603067207282340BDAB710C5 /* Sources */, 276 | DAC5F88D59C13249B4A58D5FB8943B28 /* Frameworks */, 277 | A8E8201388AB5D83A811E3AAC3078673 /* Headers */, 278 | ); 279 | buildRules = ( 280 | ); 281 | dependencies = ( 282 | C2CE6FD1AA7ED5B8EC6FDB0E067F42D8 /* PBXTargetDependency */, 283 | ); 284 | name = "Pods-FastKV_Example"; 285 | productName = "Pods-FastKV_Example"; 286 | productReference = 20A2E7261B36494151462CD80EDACEC6 /* Pods_FastKV_Example.framework */; 287 | productType = "com.apple.product-type.framework"; 288 | }; 289 | B91BBB082B7E99FBE835FA8039218236 /* Pods-FastKV_Tests */ = { 290 | isa = PBXNativeTarget; 291 | buildConfigurationList = 1B6CE8D1E952ABDA8F1FC05AF1572F90 /* Build configuration list for PBXNativeTarget "Pods-FastKV_Tests" */; 292 | buildPhases = ( 293 | 7A30AC4E59BE73AFBE046D61C94AD5FB /* Sources */, 294 | 0E59AFABBC6DAF8E917D9BB8C0D07B8F /* Frameworks */, 295 | F40C1B441B6F94157F6D3742006471C2 /* Headers */, 296 | ); 297 | buildRules = ( 298 | ); 299 | dependencies = ( 300 | C620853CEC62E33EABA670B8707FD706 /* PBXTargetDependency */, 301 | ); 302 | name = "Pods-FastKV_Tests"; 303 | productName = "Pods-FastKV_Tests"; 304 | productReference = 34D4F9B36D1119388914AD02167D8E5A /* Pods_FastKV_Tests.framework */; 305 | productType = "com.apple.product-type.framework"; 306 | }; 307 | F7AC65154BDB495AAF14C36F346648DD /* FastKV */ = { 308 | isa = PBXNativeTarget; 309 | buildConfigurationList = 3242680ED65649782B2A3CFA36EBF23A /* Build configuration list for PBXNativeTarget "FastKV" */; 310 | buildPhases = ( 311 | E2CC39BD2809A9E75BB85E40704995FA /* Sources */, 312 | 22F65C787F0B4DC39059FE64813022DB /* Frameworks */, 313 | D29F8A17309CC149367D2046E1ACEC71 /* Headers */, 314 | ); 315 | buildRules = ( 316 | ); 317 | dependencies = ( 318 | ); 319 | name = FastKV; 320 | productName = FastKV; 321 | productReference = F441F4F752FF6FBCF61E19ECAB70B2F0 /* FastKV.framework */; 322 | productType = "com.apple.product-type.framework"; 323 | }; 324 | /* End PBXNativeTarget section */ 325 | 326 | /* Begin PBXProject section */ 327 | D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { 328 | isa = PBXProject; 329 | attributes = { 330 | LastSwiftUpdateCheck = 0930; 331 | LastUpgradeCheck = 0930; 332 | }; 333 | buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; 334 | compatibilityVersion = "Xcode 3.2"; 335 | developmentRegion = English; 336 | hasScannedForEncodings = 0; 337 | knownRegions = ( 338 | en, 339 | ); 340 | mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 341 | productRefGroup = 436A1223E72E5847485E42945F9ABDB4 /* Products */; 342 | projectDirPath = ""; 343 | projectRoot = ""; 344 | targets = ( 345 | F7AC65154BDB495AAF14C36F346648DD /* FastKV */, 346 | 3AB8F632BF73068EE2A5E31FD2D74DB4 /* Pods-FastKV_Example */, 347 | B91BBB082B7E99FBE835FA8039218236 /* Pods-FastKV_Tests */, 348 | ); 349 | }; 350 | /* End PBXProject section */ 351 | 352 | /* Begin PBXSourcesBuildPhase section */ 353 | 261E8D66603067207282340BDAB710C5 /* Sources */ = { 354 | isa = PBXSourcesBuildPhase; 355 | buildActionMask = 2147483647; 356 | files = ( 357 | B9539DA3F4986F3C34B1574E44052AEF /* Pods-FastKV_Example-dummy.m in Sources */, 358 | ); 359 | runOnlyForDeploymentPostprocessing = 0; 360 | }; 361 | 7A30AC4E59BE73AFBE046D61C94AD5FB /* Sources */ = { 362 | isa = PBXSourcesBuildPhase; 363 | buildActionMask = 2147483647; 364 | files = ( 365 | 4D7E22579AA9AAE49EECAC4C1DE03F14 /* Pods-FastKV_Tests-dummy.m in Sources */, 366 | ); 367 | runOnlyForDeploymentPostprocessing = 0; 368 | }; 369 | E2CC39BD2809A9E75BB85E40704995FA /* Sources */ = { 370 | isa = PBXSourcesBuildPhase; 371 | buildActionMask = 2147483647; 372 | files = ( 373 | F232BB7D20157335ACBF9E4A02AED6B5 /* FastKV-dummy.m in Sources */, 374 | 6DD2F41CA8529120EF928D996C64FC25 /* FastKV.m in Sources */, 375 | 96730D74ADD11E6A6D0A72F6E7D60F01 /* FKVPair.m in Sources */, 376 | ); 377 | runOnlyForDeploymentPostprocessing = 0; 378 | }; 379 | /* End PBXSourcesBuildPhase section */ 380 | 381 | /* Begin PBXTargetDependency section */ 382 | C2CE6FD1AA7ED5B8EC6FDB0E067F42D8 /* PBXTargetDependency */ = { 383 | isa = PBXTargetDependency; 384 | name = FastKV; 385 | target = F7AC65154BDB495AAF14C36F346648DD /* FastKV */; 386 | targetProxy = 76A87B0DE6C02201548E4F165A055781 /* PBXContainerItemProxy */; 387 | }; 388 | C620853CEC62E33EABA670B8707FD706 /* PBXTargetDependency */ = { 389 | isa = PBXTargetDependency; 390 | name = "Pods-FastKV_Example"; 391 | target = 3AB8F632BF73068EE2A5E31FD2D74DB4 /* Pods-FastKV_Example */; 392 | targetProxy = B7FC108EBD14B4FFFA2DD4C8339A738A /* PBXContainerItemProxy */; 393 | }; 394 | /* End PBXTargetDependency section */ 395 | 396 | /* Begin XCBuildConfiguration section */ 397 | 14901E35F5413FCB1030FC2064845C80 /* Release */ = { 398 | isa = XCBuildConfiguration; 399 | baseConfigurationReference = FE4B3C83FEF6AEC94324C1328B5A31E6 /* Pods-FastKV_Tests.release.xcconfig */; 400 | buildSettings = { 401 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 402 | CODE_SIGN_IDENTITY = ""; 403 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 404 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 405 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 406 | CURRENT_PROJECT_VERSION = 1; 407 | DEFINES_MODULE = YES; 408 | DYLIB_COMPATIBILITY_VERSION = 1; 409 | DYLIB_CURRENT_VERSION = 1; 410 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 411 | INFOPLIST_FILE = "Target Support Files/Pods-FastKV_Tests/Info.plist"; 412 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 413 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 414 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 415 | MACH_O_TYPE = staticlib; 416 | MODULEMAP_FILE = "Target Support Files/Pods-FastKV_Tests/Pods-FastKV_Tests.modulemap"; 417 | OTHER_LDFLAGS = ""; 418 | OTHER_LIBTOOLFLAGS = ""; 419 | PODS_ROOT = "$(SRCROOT)"; 420 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 421 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 422 | SDKROOT = iphoneos; 423 | SKIP_INSTALL = YES; 424 | TARGETED_DEVICE_FAMILY = "1,2"; 425 | VALIDATE_PRODUCT = YES; 426 | VERSIONING_SYSTEM = "apple-generic"; 427 | VERSION_INFO_PREFIX = ""; 428 | }; 429 | name = Release; 430 | }; 431 | 1EE19F5DD95931924296F637BF18BD8F /* Debug */ = { 432 | isa = XCBuildConfiguration; 433 | buildSettings = { 434 | ALWAYS_SEARCH_USER_PATHS = NO; 435 | CLANG_ANALYZER_NONNULL = YES; 436 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 437 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 438 | CLANG_CXX_LIBRARY = "libc++"; 439 | CLANG_ENABLE_MODULES = YES; 440 | CLANG_ENABLE_OBJC_ARC = YES; 441 | CLANG_ENABLE_OBJC_WEAK = YES; 442 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 443 | CLANG_WARN_BOOL_CONVERSION = YES; 444 | CLANG_WARN_COMMA = YES; 445 | CLANG_WARN_CONSTANT_CONVERSION = YES; 446 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 447 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 448 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 449 | CLANG_WARN_EMPTY_BODY = YES; 450 | CLANG_WARN_ENUM_CONVERSION = YES; 451 | CLANG_WARN_INFINITE_RECURSION = YES; 452 | CLANG_WARN_INT_CONVERSION = YES; 453 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 454 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 455 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 456 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 457 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 458 | CLANG_WARN_STRICT_PROTOTYPES = YES; 459 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 460 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 461 | CLANG_WARN_UNREACHABLE_CODE = YES; 462 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 463 | CODE_SIGNING_ALLOWED = NO; 464 | CODE_SIGNING_REQUIRED = NO; 465 | COPY_PHASE_STRIP = NO; 466 | DEBUG_INFORMATION_FORMAT = dwarf; 467 | ENABLE_STRICT_OBJC_MSGSEND = YES; 468 | ENABLE_TESTABILITY = YES; 469 | GCC_C_LANGUAGE_STANDARD = gnu11; 470 | GCC_DYNAMIC_NO_PIC = NO; 471 | GCC_NO_COMMON_BLOCKS = YES; 472 | GCC_OPTIMIZATION_LEVEL = 0; 473 | GCC_PREPROCESSOR_DEFINITIONS = ( 474 | "POD_CONFIGURATION_DEBUG=1", 475 | "DEBUG=1", 476 | "$(inherited)", 477 | ); 478 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 479 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 480 | GCC_WARN_UNDECLARED_SELECTOR = YES; 481 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 482 | GCC_WARN_UNUSED_FUNCTION = YES; 483 | GCC_WARN_UNUSED_VARIABLE = YES; 484 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 485 | MTL_ENABLE_DEBUG_INFO = YES; 486 | ONLY_ACTIVE_ARCH = YES; 487 | PRODUCT_NAME = "$(TARGET_NAME)"; 488 | STRIP_INSTALLED_PRODUCT = NO; 489 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 490 | SYMROOT = "${SRCROOT}/../build"; 491 | }; 492 | name = Debug; 493 | }; 494 | 598D89BBBA2696458706A1086B88F238 /* Release */ = { 495 | isa = XCBuildConfiguration; 496 | baseConfigurationReference = 500410E021DF1F546CD59AD02C98D523 /* FastKV.xcconfig */; 497 | buildSettings = { 498 | CODE_SIGN_IDENTITY = ""; 499 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 500 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 501 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 502 | CURRENT_PROJECT_VERSION = 1; 503 | DEFINES_MODULE = YES; 504 | DYLIB_COMPATIBILITY_VERSION = 1; 505 | DYLIB_CURRENT_VERSION = 1; 506 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 507 | GCC_PREFIX_HEADER = "Target Support Files/FastKV/FastKV-prefix.pch"; 508 | INFOPLIST_FILE = "Target Support Files/FastKV/Info.plist"; 509 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 510 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 511 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 512 | MODULEMAP_FILE = "Target Support Files/FastKV/FastKV.modulemap"; 513 | PRODUCT_MODULE_NAME = FastKV; 514 | PRODUCT_NAME = FastKV; 515 | SDKROOT = iphoneos; 516 | SKIP_INSTALL = YES; 517 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 518 | TARGETED_DEVICE_FAMILY = "1,2"; 519 | VALIDATE_PRODUCT = YES; 520 | VERSIONING_SYSTEM = "apple-generic"; 521 | VERSION_INFO_PREFIX = ""; 522 | }; 523 | name = Release; 524 | }; 525 | B16CFF1470F429AC6B24D4E40581329D /* Release */ = { 526 | isa = XCBuildConfiguration; 527 | baseConfigurationReference = 741867BE392B67D599C012F274C811CD /* Pods-FastKV_Example.release.xcconfig */; 528 | buildSettings = { 529 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 530 | CODE_SIGN_IDENTITY = ""; 531 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 532 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 533 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 534 | CURRENT_PROJECT_VERSION = 1; 535 | DEFINES_MODULE = YES; 536 | DYLIB_COMPATIBILITY_VERSION = 1; 537 | DYLIB_CURRENT_VERSION = 1; 538 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 539 | INFOPLIST_FILE = "Target Support Files/Pods-FastKV_Example/Info.plist"; 540 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 541 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 542 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 543 | MACH_O_TYPE = staticlib; 544 | MODULEMAP_FILE = "Target Support Files/Pods-FastKV_Example/Pods-FastKV_Example.modulemap"; 545 | OTHER_LDFLAGS = ""; 546 | OTHER_LIBTOOLFLAGS = ""; 547 | PODS_ROOT = "$(SRCROOT)"; 548 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 549 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 550 | SDKROOT = iphoneos; 551 | SKIP_INSTALL = YES; 552 | TARGETED_DEVICE_FAMILY = "1,2"; 553 | VALIDATE_PRODUCT = YES; 554 | VERSIONING_SYSTEM = "apple-generic"; 555 | VERSION_INFO_PREFIX = ""; 556 | }; 557 | name = Release; 558 | }; 559 | B468E659A91562D6D522B7853E512F25 /* Debug */ = { 560 | isa = XCBuildConfiguration; 561 | baseConfigurationReference = 39E3C671FED15503ECBB27B2A9A4F8BD /* Pods-FastKV_Example.debug.xcconfig */; 562 | buildSettings = { 563 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 564 | CODE_SIGN_IDENTITY = ""; 565 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 566 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 567 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 568 | CURRENT_PROJECT_VERSION = 1; 569 | DEFINES_MODULE = YES; 570 | DYLIB_COMPATIBILITY_VERSION = 1; 571 | DYLIB_CURRENT_VERSION = 1; 572 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 573 | INFOPLIST_FILE = "Target Support Files/Pods-FastKV_Example/Info.plist"; 574 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 575 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 576 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 577 | MACH_O_TYPE = staticlib; 578 | MODULEMAP_FILE = "Target Support Files/Pods-FastKV_Example/Pods-FastKV_Example.modulemap"; 579 | OTHER_LDFLAGS = ""; 580 | OTHER_LIBTOOLFLAGS = ""; 581 | PODS_ROOT = "$(SRCROOT)"; 582 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 583 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 584 | SDKROOT = iphoneos; 585 | SKIP_INSTALL = YES; 586 | TARGETED_DEVICE_FAMILY = "1,2"; 587 | VERSIONING_SYSTEM = "apple-generic"; 588 | VERSION_INFO_PREFIX = ""; 589 | }; 590 | name = Debug; 591 | }; 592 | CF590316E8E0EF69BD192285E1CC49FF /* Debug */ = { 593 | isa = XCBuildConfiguration; 594 | baseConfigurationReference = 500410E021DF1F546CD59AD02C98D523 /* FastKV.xcconfig */; 595 | buildSettings = { 596 | CODE_SIGN_IDENTITY = ""; 597 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 598 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 599 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 600 | CURRENT_PROJECT_VERSION = 1; 601 | DEFINES_MODULE = YES; 602 | DYLIB_COMPATIBILITY_VERSION = 1; 603 | DYLIB_CURRENT_VERSION = 1; 604 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 605 | GCC_PREFIX_HEADER = "Target Support Files/FastKV/FastKV-prefix.pch"; 606 | INFOPLIST_FILE = "Target Support Files/FastKV/Info.plist"; 607 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 608 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 609 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 610 | MODULEMAP_FILE = "Target Support Files/FastKV/FastKV.modulemap"; 611 | PRODUCT_MODULE_NAME = FastKV; 612 | PRODUCT_NAME = FastKV; 613 | SDKROOT = iphoneos; 614 | SKIP_INSTALL = YES; 615 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 616 | TARGETED_DEVICE_FAMILY = "1,2"; 617 | VERSIONING_SYSTEM = "apple-generic"; 618 | VERSION_INFO_PREFIX = ""; 619 | }; 620 | name = Debug; 621 | }; 622 | E46D3079F48A3D7CCA58D95A63D5C51B /* Debug */ = { 623 | isa = XCBuildConfiguration; 624 | baseConfigurationReference = E8A9B4AF74906401DEAFA6A3599A67ED /* Pods-FastKV_Tests.debug.xcconfig */; 625 | buildSettings = { 626 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 627 | CODE_SIGN_IDENTITY = ""; 628 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 629 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 630 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 631 | CURRENT_PROJECT_VERSION = 1; 632 | DEFINES_MODULE = YES; 633 | DYLIB_COMPATIBILITY_VERSION = 1; 634 | DYLIB_CURRENT_VERSION = 1; 635 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 636 | INFOPLIST_FILE = "Target Support Files/Pods-FastKV_Tests/Info.plist"; 637 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 638 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 639 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 640 | MACH_O_TYPE = staticlib; 641 | MODULEMAP_FILE = "Target Support Files/Pods-FastKV_Tests/Pods-FastKV_Tests.modulemap"; 642 | OTHER_LDFLAGS = ""; 643 | OTHER_LIBTOOLFLAGS = ""; 644 | PODS_ROOT = "$(SRCROOT)"; 645 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 646 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 647 | SDKROOT = iphoneos; 648 | SKIP_INSTALL = YES; 649 | TARGETED_DEVICE_FAMILY = "1,2"; 650 | VERSIONING_SYSTEM = "apple-generic"; 651 | VERSION_INFO_PREFIX = ""; 652 | }; 653 | name = Debug; 654 | }; 655 | F4568DEE257655D290C2B9CEAB37C934 /* Release */ = { 656 | isa = XCBuildConfiguration; 657 | buildSettings = { 658 | ALWAYS_SEARCH_USER_PATHS = NO; 659 | CLANG_ANALYZER_NONNULL = YES; 660 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 661 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 662 | CLANG_CXX_LIBRARY = "libc++"; 663 | CLANG_ENABLE_MODULES = YES; 664 | CLANG_ENABLE_OBJC_ARC = YES; 665 | CLANG_ENABLE_OBJC_WEAK = YES; 666 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 667 | CLANG_WARN_BOOL_CONVERSION = YES; 668 | CLANG_WARN_COMMA = YES; 669 | CLANG_WARN_CONSTANT_CONVERSION = YES; 670 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 671 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 672 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 673 | CLANG_WARN_EMPTY_BODY = YES; 674 | CLANG_WARN_ENUM_CONVERSION = YES; 675 | CLANG_WARN_INFINITE_RECURSION = YES; 676 | CLANG_WARN_INT_CONVERSION = YES; 677 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 678 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 679 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 680 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 681 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 682 | CLANG_WARN_STRICT_PROTOTYPES = YES; 683 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 684 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 685 | CLANG_WARN_UNREACHABLE_CODE = YES; 686 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 687 | CODE_SIGNING_ALLOWED = NO; 688 | CODE_SIGNING_REQUIRED = NO; 689 | COPY_PHASE_STRIP = NO; 690 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 691 | ENABLE_NS_ASSERTIONS = NO; 692 | ENABLE_STRICT_OBJC_MSGSEND = YES; 693 | GCC_C_LANGUAGE_STANDARD = gnu11; 694 | GCC_NO_COMMON_BLOCKS = YES; 695 | GCC_PREPROCESSOR_DEFINITIONS = ( 696 | "POD_CONFIGURATION_RELEASE=1", 697 | "$(inherited)", 698 | ); 699 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 700 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 701 | GCC_WARN_UNDECLARED_SELECTOR = YES; 702 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 703 | GCC_WARN_UNUSED_FUNCTION = YES; 704 | GCC_WARN_UNUSED_VARIABLE = YES; 705 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 706 | MTL_ENABLE_DEBUG_INFO = NO; 707 | PRODUCT_NAME = "$(TARGET_NAME)"; 708 | STRIP_INSTALLED_PRODUCT = NO; 709 | SYMROOT = "${SRCROOT}/../build"; 710 | }; 711 | name = Release; 712 | }; 713 | /* End XCBuildConfiguration section */ 714 | 715 | /* Begin XCConfigurationList section */ 716 | 1B6CE8D1E952ABDA8F1FC05AF1572F90 /* Build configuration list for PBXNativeTarget "Pods-FastKV_Tests" */ = { 717 | isa = XCConfigurationList; 718 | buildConfigurations = ( 719 | E46D3079F48A3D7CCA58D95A63D5C51B /* Debug */, 720 | 14901E35F5413FCB1030FC2064845C80 /* Release */, 721 | ); 722 | defaultConfigurationIsVisible = 0; 723 | defaultConfigurationName = Release; 724 | }; 725 | 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 726 | isa = XCConfigurationList; 727 | buildConfigurations = ( 728 | 1EE19F5DD95931924296F637BF18BD8F /* Debug */, 729 | F4568DEE257655D290C2B9CEAB37C934 /* Release */, 730 | ); 731 | defaultConfigurationIsVisible = 0; 732 | defaultConfigurationName = Release; 733 | }; 734 | 3242680ED65649782B2A3CFA36EBF23A /* Build configuration list for PBXNativeTarget "FastKV" */ = { 735 | isa = XCConfigurationList; 736 | buildConfigurations = ( 737 | CF590316E8E0EF69BD192285E1CC49FF /* Debug */, 738 | 598D89BBBA2696458706A1086B88F238 /* Release */, 739 | ); 740 | defaultConfigurationIsVisible = 0; 741 | defaultConfigurationName = Release; 742 | }; 743 | 4BC62CD8609AF4C5BF1F56ADEE5F5E4D /* Build configuration list for PBXNativeTarget "Pods-FastKV_Example" */ = { 744 | isa = XCConfigurationList; 745 | buildConfigurations = ( 746 | B468E659A91562D6D522B7853E512F25 /* Debug */, 747 | B16CFF1470F429AC6B24D4E40581329D /* Release */, 748 | ); 749 | defaultConfigurationIsVisible = 0; 750 | defaultConfigurationName = Release; 751 | }; 752 | /* End XCConfigurationList section */ 753 | }; 754 | rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 755 | } 756 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/FastKV/FastKV-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_FastKV : NSObject 3 | @end 4 | @implementation PodsDummy_FastKV 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/FastKV/FastKV-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/FastKV/FastKV-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "FastKV.h" 14 | #import "FKVPair.h" 15 | 16 | FOUNDATION_EXPORT double FastKVVersionNumber; 17 | FOUNDATION_EXPORT const unsigned char FastKVVersionString[]; 18 | 19 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/FastKV/FastKV.modulemap: -------------------------------------------------------------------------------- 1 | framework module FastKV { 2 | umbrella header "FastKV-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/FastKV/FastKV.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FastKV 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | PODS_BUILD_DIR = ${BUILD_DIR} 4 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 5 | PODS_ROOT = ${SRCROOT} 6 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 7 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 8 | SKIP_INSTALL = YES 9 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/FastKV/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Example/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Example/Pods-FastKV_Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## FastKV 5 | 6 | Copyright (c) 2018 yao.li 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - https://cocoapods.org 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Example/Pods-FastKV_Example-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2018 yao.li <yao.li@cootek.cn> 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | License 38 | MIT 39 | Title 40 | FastKV 41 | Type 42 | PSGroupSpecifier 43 | 44 | 45 | FooterText 46 | Generated by CocoaPods - https://cocoapods.org 47 | Title 48 | 49 | Type 50 | PSGroupSpecifier 51 | 52 | 53 | StringsTable 54 | Acknowledgements 55 | Title 56 | Acknowledgements 57 | 58 | 59 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Example/Pods-FastKV_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_FastKV_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_FastKV_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Example/Pods-FastKV_Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 7 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # frameworks to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 13 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 14 | 15 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 16 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 17 | 18 | # Used as a return value for each invocation of `strip_invalid_archs` function. 19 | STRIP_BINARY_RETVAL=0 20 | 21 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 22 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 23 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 24 | 25 | # Copies and strips a vendored framework 26 | install_framework() 27 | { 28 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 29 | local source="${BUILT_PRODUCTS_DIR}/$1" 30 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 31 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 32 | elif [ -r "$1" ]; then 33 | local source="$1" 34 | fi 35 | 36 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 37 | 38 | if [ -L "${source}" ]; then 39 | echo "Symlinked..." 40 | source="$(readlink "${source}")" 41 | fi 42 | 43 | # Use filter instead of exclude so missing patterns don't throw errors. 44 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 45 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 46 | 47 | local basename 48 | basename="$(basename -s .framework "$1")" 49 | binary="${destination}/${basename}.framework/${basename}" 50 | if ! [ -r "$binary" ]; then 51 | binary="${destination}/${basename}" 52 | fi 53 | 54 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 55 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 56 | strip_invalid_archs "$binary" 57 | fi 58 | 59 | # Resign the code if required by the build settings to avoid unstable apps 60 | code_sign_if_enabled "${destination}/$(basename "$1")" 61 | 62 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 63 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 64 | local swift_runtime_libs 65 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 66 | for lib in $swift_runtime_libs; do 67 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 68 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 69 | code_sign_if_enabled "${destination}/${lib}" 70 | done 71 | fi 72 | } 73 | 74 | # Copies and strips a vendored dSYM 75 | install_dsym() { 76 | local source="$1" 77 | if [ -r "$source" ]; then 78 | # Copy the dSYM into a the targets temp dir. 79 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 80 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 81 | 82 | local basename 83 | basename="$(basename -s .framework.dSYM "$source")" 84 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 85 | 86 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 87 | if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then 88 | strip_invalid_archs "$binary" 89 | fi 90 | 91 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 92 | # Move the stripped file into its final destination. 93 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 94 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 95 | else 96 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 97 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 98 | fi 99 | fi 100 | } 101 | 102 | # Signs a framework with the provided identity 103 | code_sign_if_enabled() { 104 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 105 | # Use the current code_sign_identitiy 106 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 107 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 108 | 109 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 110 | code_sign_cmd="$code_sign_cmd &" 111 | fi 112 | echo "$code_sign_cmd" 113 | eval "$code_sign_cmd" 114 | fi 115 | } 116 | 117 | # Strip invalid architectures 118 | strip_invalid_archs() { 119 | binary="$1" 120 | # Get architectures for current target binary 121 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 122 | # Intersect them with the architectures we are building for 123 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 124 | # If there are no archs supported by this binary then warn the user 125 | if [[ -z "$intersected_archs" ]]; then 126 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 127 | STRIP_BINARY_RETVAL=0 128 | return 129 | fi 130 | stripped="" 131 | for arch in $binary_archs; do 132 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 133 | # Strip non-valid architectures in-place 134 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 135 | stripped="$stripped $arch" 136 | fi 137 | done 138 | if [[ "$stripped" ]]; then 139 | echo "Stripped $binary of architectures:$stripped" 140 | fi 141 | STRIP_BINARY_RETVAL=1 142 | } 143 | 144 | 145 | if [[ "$CONFIGURATION" == "Debug" ]]; then 146 | install_framework "${BUILT_PRODUCTS_DIR}/FastKV/FastKV.framework" 147 | fi 148 | if [[ "$CONFIGURATION" == "Release" ]]; then 149 | install_framework "${BUILT_PRODUCTS_DIR}/FastKV/FastKV.framework" 150 | fi 151 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 152 | wait 153 | fi 154 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Example/Pods-FastKV_Example-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then 7 | # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # resources to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 13 | 14 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 15 | > "$RESOURCES_TO_COPY" 16 | 17 | XCASSET_FILES=() 18 | 19 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 20 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 21 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 22 | 23 | case "${TARGETED_DEVICE_FAMILY:-}" in 24 | 1,2) 25 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 26 | ;; 27 | 1) 28 | TARGET_DEVICE_ARGS="--target-device iphone" 29 | ;; 30 | 2) 31 | TARGET_DEVICE_ARGS="--target-device ipad" 32 | ;; 33 | 3) 34 | TARGET_DEVICE_ARGS="--target-device tv" 35 | ;; 36 | 4) 37 | TARGET_DEVICE_ARGS="--target-device watch" 38 | ;; 39 | *) 40 | TARGET_DEVICE_ARGS="--target-device mac" 41 | ;; 42 | esac 43 | 44 | install_resource() 45 | { 46 | if [[ "$1" = /* ]] ; then 47 | RESOURCE_PATH="$1" 48 | else 49 | RESOURCE_PATH="${PODS_ROOT}/$1" 50 | fi 51 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 52 | cat << EOM 53 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 54 | EOM 55 | exit 1 56 | fi 57 | case $RESOURCE_PATH in 58 | *.storyboard) 59 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 60 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 61 | ;; 62 | *.xib) 63 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 64 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 65 | ;; 66 | *.framework) 67 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 68 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 69 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 70 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 71 | ;; 72 | *.xcdatamodel) 73 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true 74 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 75 | ;; 76 | *.xcdatamodeld) 77 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true 78 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 79 | ;; 80 | *.xcmappingmodel) 81 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true 82 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 83 | ;; 84 | *.xcassets) 85 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 86 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 87 | ;; 88 | *) 89 | echo "$RESOURCE_PATH" || true 90 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 91 | ;; 92 | esac 93 | } 94 | 95 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 96 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 97 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 98 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 99 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 100 | fi 101 | rm -f "$RESOURCES_TO_COPY" 102 | 103 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] 104 | then 105 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 106 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 107 | while read line; do 108 | if [[ $line != "${PODS_ROOT}*" ]]; then 109 | XCASSET_FILES+=("$line") 110 | fi 111 | done <<<"$OTHER_XCASSETS" 112 | 113 | if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then 114 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 115 | else 116 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" 117 | fi 118 | fi 119 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Example/Pods-FastKV_Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_FastKV_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_FastKV_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Example/Pods-FastKV_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FastKV" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FastKV/FastKV.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -framework "FastKV" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Example/Pods-FastKV_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_FastKV_Example { 2 | umbrella header "Pods-FastKV_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Example/Pods-FastKV_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FastKV" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FastKV/FastKV.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -framework "FastKV" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Tests/Pods-FastKV_Tests-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Tests/Pods-FastKV_Tests-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Tests/Pods-FastKV_Tests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_FastKV_Tests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_FastKV_Tests 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Tests/Pods-FastKV_Tests-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 7 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # frameworks to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 13 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 14 | 15 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 16 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 17 | 18 | # Used as a return value for each invocation of `strip_invalid_archs` function. 19 | STRIP_BINARY_RETVAL=0 20 | 21 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 22 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 23 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 24 | 25 | # Copies and strips a vendored framework 26 | install_framework() 27 | { 28 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 29 | local source="${BUILT_PRODUCTS_DIR}/$1" 30 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 31 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 32 | elif [ -r "$1" ]; then 33 | local source="$1" 34 | fi 35 | 36 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 37 | 38 | if [ -L "${source}" ]; then 39 | echo "Symlinked..." 40 | source="$(readlink "${source}")" 41 | fi 42 | 43 | # Use filter instead of exclude so missing patterns don't throw errors. 44 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 45 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 46 | 47 | local basename 48 | basename="$(basename -s .framework "$1")" 49 | binary="${destination}/${basename}.framework/${basename}" 50 | if ! [ -r "$binary" ]; then 51 | binary="${destination}/${basename}" 52 | fi 53 | 54 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 55 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 56 | strip_invalid_archs "$binary" 57 | fi 58 | 59 | # Resign the code if required by the build settings to avoid unstable apps 60 | code_sign_if_enabled "${destination}/$(basename "$1")" 61 | 62 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 63 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 64 | local swift_runtime_libs 65 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 66 | for lib in $swift_runtime_libs; do 67 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 68 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 69 | code_sign_if_enabled "${destination}/${lib}" 70 | done 71 | fi 72 | } 73 | 74 | # Copies and strips a vendored dSYM 75 | install_dsym() { 76 | local source="$1" 77 | if [ -r "$source" ]; then 78 | # Copy the dSYM into a the targets temp dir. 79 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 80 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 81 | 82 | local basename 83 | basename="$(basename -s .framework.dSYM "$source")" 84 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 85 | 86 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 87 | if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then 88 | strip_invalid_archs "$binary" 89 | fi 90 | 91 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 92 | # Move the stripped file into its final destination. 93 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 94 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 95 | else 96 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 97 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 98 | fi 99 | fi 100 | } 101 | 102 | # Signs a framework with the provided identity 103 | code_sign_if_enabled() { 104 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 105 | # Use the current code_sign_identitiy 106 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 107 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 108 | 109 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 110 | code_sign_cmd="$code_sign_cmd &" 111 | fi 112 | echo "$code_sign_cmd" 113 | eval "$code_sign_cmd" 114 | fi 115 | } 116 | 117 | # Strip invalid architectures 118 | strip_invalid_archs() { 119 | binary="$1" 120 | # Get architectures for current target binary 121 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 122 | # Intersect them with the architectures we are building for 123 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 124 | # If there are no archs supported by this binary then warn the user 125 | if [[ -z "$intersected_archs" ]]; then 126 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 127 | STRIP_BINARY_RETVAL=0 128 | return 129 | fi 130 | stripped="" 131 | for arch in $binary_archs; do 132 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 133 | # Strip non-valid architectures in-place 134 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 135 | stripped="$stripped $arch" 136 | fi 137 | done 138 | if [[ "$stripped" ]]; then 139 | echo "Stripped $binary of architectures:$stripped" 140 | fi 141 | STRIP_BINARY_RETVAL=1 142 | } 143 | 144 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 145 | wait 146 | fi 147 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Tests/Pods-FastKV_Tests-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then 7 | # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # resources to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 13 | 14 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 15 | > "$RESOURCES_TO_COPY" 16 | 17 | XCASSET_FILES=() 18 | 19 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 20 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 21 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 22 | 23 | case "${TARGETED_DEVICE_FAMILY:-}" in 24 | 1,2) 25 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 26 | ;; 27 | 1) 28 | TARGET_DEVICE_ARGS="--target-device iphone" 29 | ;; 30 | 2) 31 | TARGET_DEVICE_ARGS="--target-device ipad" 32 | ;; 33 | 3) 34 | TARGET_DEVICE_ARGS="--target-device tv" 35 | ;; 36 | 4) 37 | TARGET_DEVICE_ARGS="--target-device watch" 38 | ;; 39 | *) 40 | TARGET_DEVICE_ARGS="--target-device mac" 41 | ;; 42 | esac 43 | 44 | install_resource() 45 | { 46 | if [[ "$1" = /* ]] ; then 47 | RESOURCE_PATH="$1" 48 | else 49 | RESOURCE_PATH="${PODS_ROOT}/$1" 50 | fi 51 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 52 | cat << EOM 53 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 54 | EOM 55 | exit 1 56 | fi 57 | case $RESOURCE_PATH in 58 | *.storyboard) 59 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 60 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 61 | ;; 62 | *.xib) 63 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 64 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 65 | ;; 66 | *.framework) 67 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 68 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 69 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 70 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 71 | ;; 72 | *.xcdatamodel) 73 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true 74 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 75 | ;; 76 | *.xcdatamodeld) 77 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true 78 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 79 | ;; 80 | *.xcmappingmodel) 81 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true 82 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 83 | ;; 84 | *.xcassets) 85 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 86 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 87 | ;; 88 | *) 89 | echo "$RESOURCE_PATH" || true 90 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 91 | ;; 92 | esac 93 | } 94 | 95 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 96 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 97 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 98 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 99 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 100 | fi 101 | rm -f "$RESOURCES_TO_COPY" 102 | 103 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] 104 | then 105 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 106 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 107 | while read line; do 108 | if [[ $line != "${PODS_ROOT}*" ]]; then 109 | XCASSET_FILES+=("$line") 110 | fi 111 | done <<<"$OTHER_XCASSETS" 112 | 113 | if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then 114 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 115 | else 116 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" 117 | fi 118 | fi 119 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Tests/Pods-FastKV_Tests-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_FastKV_TestsVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_FastKV_TestsVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Tests/Pods-FastKV_Tests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FastKV" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FastKV/FastKV.framework/Headers" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Tests/Pods-FastKV_Tests.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_FastKV_Tests { 2 | umbrella header "Pods-FastKV_Tests-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-FastKV_Tests/Pods-FastKV_Tests.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FastKV" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FastKV/FastKV.framework/Headers" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | -------------------------------------------------------------------------------- /Example/Tests/Tests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Example/Tests/Tests-Prefix.pch: -------------------------------------------------------------------------------- 1 | // The contents of this file are implicitly included at the beginning of every test case source file. 2 | 3 | #ifdef __OBJC__ 4 | 5 | 6 | 7 | #endif 8 | -------------------------------------------------------------------------------- /Example/Tests/Tests.m: -------------------------------------------------------------------------------- 1 | // 2 | // FastKVTests.m 3 | // FastKVTests 4 | // 5 | // Created by yao.li on 08/09/2018. 6 | // Copyright (c) 2018 yao.li. All rights reserved. 7 | // 8 | 9 | @import XCTest; 10 | 11 | @interface Tests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation Tests 16 | 17 | - (void)setUp 18 | { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown 24 | { 25 | // Put teardown code here. This method is called after the invocation of each test method in the class. 26 | [super tearDown]; 27 | } 28 | 29 | - (void)testExample 30 | { 31 | XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); 32 | } 33 | 34 | @end 35 | 36 | -------------------------------------------------------------------------------- /Example/Tests/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /FastKV.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint FastKV.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'FastKV' 11 | s.version = '0.3.0' 12 | s.summary = 'FastKV is a real-time and high-performance key-value components.' 13 | 14 | # This description is used to generate tags and improve search results. 15 | # * Think: What does it do? Why did you write it? What is the focus? 16 | # * Try to keep it short, snappy and to the point. 17 | # * Write the description between the DESC delimiters below. 18 | # * Finally, don't worry about the indent, CocoaPods strips it! 19 | 20 | s.description = <<-DESC 21 | FastKV is a real-time and high-performance key-value components based on mmap. 22 | DESC 23 | 24 | s.homepage = 'https://github.com/RyanLeeLY/FastKV' 25 | # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' 26 | s.license = { :type => 'MIT', :file => 'LICENSE' } 27 | s.author = { 'yao.li' => 'liyaoxjtu2013@gmail.com' } 28 | s.source = { :git => 'https://github.com/RyanLeeLY/FastKV.git', :tag => s.version.to_s } 29 | 30 | 31 | s.ios.deployment_target = '8.0' 32 | 33 | s.source_files = 'FastKV/Classes/**/*' 34 | 35 | # s.resource_bundles = { 36 | # 'FastKV' => ['FastKV/Assets/*.png'] 37 | # } 38 | 39 | # s.public_header_files = 'Pod/Classes/**/*.h' 40 | # s.frameworks = 'UIKit', 'MapKit' 41 | # s.dependency 'AFNetworking', '~> 2.3' 42 | end 43 | -------------------------------------------------------------------------------- /FastKV/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RyanLeeLY/FastKV/98aeffacee53a101e473e110955e75d0d5f7260f/FastKV/Assets/.gitkeep -------------------------------------------------------------------------------- /FastKV/Classes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RyanLeeLY/FastKV/98aeffacee53a101e473e110955e75d0d5f7260f/FastKV/Classes/.gitkeep -------------------------------------------------------------------------------- /FastKV/Classes/FKVPair.h: -------------------------------------------------------------------------------- 1 | // 2 | // FKVPair.h 3 | // FastKV 4 | // 5 | // Created by Yao Li on 2018/8/9. 6 | // 7 | 8 | #import 9 | 10 | typedef NS_ENUM(NSUInteger, FKVPairType) { 11 | FKVPairTypeRemoved = 0, 12 | FKVPairTypeNil, 13 | FKVPairTypeBOOL, 14 | FKVPairTypeInt32, 15 | FKVPairTypeInt64, 16 | FKVPairTypeFloat, 17 | FKVPairTypeDouble, 18 | FKVPairTypeString, 19 | FKVPairTypeData, 20 | }; 21 | 22 | @protocol FKVCoding 23 | + (id)parseFromData:(NSData *)data error:(NSError *__autoreleasing *)error; 24 | 25 | - (NSData *)representationData; 26 | @end 27 | 28 | @interface FKVPair : NSObject 29 | 30 | @property(assign, nonatomic) FKVPairType valueType; 31 | 32 | @property(copy, nonatomic) NSString *objcType; 33 | 34 | @property(copy, nonatomic) NSString *key; 35 | 36 | @property(assign, nonatomic) BOOL boolVal; 37 | 38 | @property(assign, nonatomic) int32_t int32Val; 39 | 40 | @property(assign, nonatomic) int64_t int64Val; 41 | 42 | @property(assign, nonatomic) float floatVal; 43 | 44 | @property(assign, nonatomic) double doubleVal; 45 | 46 | @property(copy, nonatomic) NSString *stringVal; 47 | 48 | @property(copy, nonatomic) NSData *binaryVal; 49 | 50 | @property(assign, nonatomic) uint32_t fkv_version; 51 | 52 | - (instancetype)initWithValueType:(FKVPairType)valueType 53 | objcType:(NSString *)objcType 54 | key:(NSString *)key 55 | version:(uint32_t)version; 56 | @end 57 | 58 | @interface FKVPairList : NSObject 59 | @property(copy, nonatomic) NSMutableArray *items; 60 | @end 61 | 62 | @interface NSData (FKVPair) 63 | - (uint16_t)fkv_crc16; 64 | @end 65 | -------------------------------------------------------------------------------- /FastKV/Classes/FKVPair.m: -------------------------------------------------------------------------------- 1 | // 2 | // FKVPair.m 3 | // FastKV 4 | // 5 | // Created by Yao Li on 2018/8/9. 6 | // 7 | 8 | #import "FKVPair.h" 9 | #import "FastKV.h" 10 | 11 | /** 12 | FKVPair Coding Data Format 13 | 14 | //Header Segment// 15 | valueType[NSUInteger] | version[uint32_t] | objcTypeLength[NSUInteger] | keyLength:[NSUInteger] | dataLength[NSUInteger] 16 | 17 | //Data Segment// 18 | objcType[Byte] | key[Byte] | data[Byte] 19 | 20 | //Check Code// 21 | CRC[uint16_t] 22 | */ 23 | 24 | @implementation FKVPair 25 | - (instancetype)initWithValueType:(FKVPairType)valueType 26 | objcType:(NSString *)objcType 27 | key:(NSString *)key 28 | version:(uint32_t)version { 29 | self = [self init]; 30 | if (self) { 31 | _valueType = valueType; 32 | _objcType = objcType; 33 | _key = key; 34 | _fkv_version = version; 35 | } 36 | return self; 37 | } 38 | 39 | + (id)parseFromData:(NSData *)data error:(NSError *__autoreleasing *)error { 40 | if (data.length == 0) { 41 | return nil; 42 | } 43 | 44 | // CRC check 45 | uint16_t crc = [[data subdataWithRange:NSMakeRange(0, data.length-2)] fkv_crc16]; 46 | uint16_t crcInData; 47 | [data getBytes:&crcInData range:NSMakeRange(data.length-2, 2)]; 48 | if (crc != crcInData) { 49 | return nil; 50 | } 51 | 52 | FKVPair *pair = [[FKVPair alloc] init]; 53 | 54 | NSUInteger currentIndex = 0; 55 | 56 | FKVPairType valueType; 57 | [data getBytes:&valueType range:NSMakeRange(currentIndex, sizeof(FKVPairType))]; 58 | currentIndex += sizeof(FKVPairType); 59 | pair.valueType = valueType; 60 | 61 | uint32_t fkv_version; 62 | [data getBytes:&fkv_version range:NSMakeRange(currentIndex, sizeof(uint32_t))]; 63 | currentIndex += sizeof(uint32_t); 64 | pair.fkv_version = fkv_version; 65 | 66 | NSUInteger objcTypeLength = 0; 67 | [data getBytes:&objcTypeLength range:NSMakeRange(currentIndex, sizeof(NSUInteger))]; 68 | currentIndex += sizeof(NSUInteger); 69 | 70 | NSUInteger keyLength = 0; 71 | [data getBytes:&keyLength range:NSMakeRange(currentIndex, sizeof(NSUInteger))]; 72 | currentIndex += sizeof(NSUInteger); 73 | 74 | NSUInteger dataLength = 0; 75 | [data getBytes:&dataLength range:NSMakeRange(currentIndex, sizeof(NSUInteger))]; 76 | currentIndex += sizeof(NSUInteger); 77 | 78 | pair.objcType = [[NSString alloc] initWithBytes:[data bytes] + currentIndex 79 | length:objcTypeLength 80 | encoding:NSUTF8StringEncoding]; 81 | currentIndex += objcTypeLength; 82 | 83 | pair.key = [[NSString alloc] initWithBytes:[data bytes] + currentIndex 84 | length:keyLength 85 | encoding:NSUTF8StringEncoding]; 86 | currentIndex += keyLength; 87 | 88 | switch (valueType) { 89 | case FKVPairTypeRemoved: 90 | case FKVPairTypeNil: 91 | break; 92 | case FKVPairTypeBOOL: { 93 | BOOL boolVal; 94 | [data getBytes:&boolVal range:NSMakeRange(currentIndex, dataLength)]; 95 | pair.boolVal = boolVal; 96 | break; 97 | } 98 | case FKVPairTypeInt32: { 99 | int32_t int32Val; 100 | [data getBytes:&int32Val range:NSMakeRange(currentIndex, dataLength)]; 101 | pair.int32Val = int32Val; 102 | break; 103 | } 104 | case FKVPairTypeInt64: { 105 | int64_t int64Val; 106 | [data getBytes:&int64Val range:NSMakeRange(currentIndex, dataLength)]; 107 | pair.int64Val = int64Val; 108 | break; 109 | } 110 | case FKVPairTypeFloat: { 111 | float floatVal; 112 | [data getBytes:&floatVal range:NSMakeRange(currentIndex, dataLength)]; 113 | pair.floatVal = floatVal; 114 | break; 115 | } 116 | case FKVPairTypeDouble: { 117 | double doubleVal; 118 | [data getBytes:&doubleVal range:NSMakeRange(currentIndex, dataLength)]; 119 | pair.doubleVal = doubleVal; 120 | break; 121 | } 122 | case FKVPairTypeString: { 123 | pair.stringVal = [[NSString alloc] initWithBytes:[data bytes] + currentIndex 124 | length:dataLength 125 | encoding:NSUTF8StringEncoding]; 126 | break; 127 | } 128 | case FKVPairTypeData: { 129 | pair.binaryVal = [data subdataWithRange:NSMakeRange(currentIndex, dataLength)]; 130 | break; 131 | } 132 | } 133 | 134 | return pair; 135 | } 136 | 137 | - (NSData *)representationData { 138 | NSMutableData *dataM = [NSMutableData data]; 139 | FKVPairType valueType = self.valueType; 140 | [dataM appendBytes:&valueType length:sizeof(FKVPairType)]; 141 | 142 | uint32_t fkv_version = self.fkv_version; 143 | [dataM appendBytes:&fkv_version length:sizeof(uint32_t)]; 144 | 145 | NSUInteger objcTypeLength = [self.objcType lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; 146 | [dataM appendBytes:&objcTypeLength length:sizeof(NSUInteger)]; 147 | 148 | NSUInteger keyLength = [self.key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; 149 | [dataM appendBytes:&keyLength length:sizeof(NSUInteger)]; 150 | 151 | NSUInteger dataLength; 152 | switch (valueType) { 153 | case FKVPairTypeRemoved: 154 | case FKVPairTypeNil: { 155 | dataLength = 0; 156 | [dataM appendBytes:&dataLength length:sizeof(NSUInteger)]; 157 | 158 | [dataM appendBytes:[self.objcType UTF8String] length:objcTypeLength]; 159 | [dataM appendBytes:[self.key UTF8String] length:keyLength]; 160 | break; 161 | } 162 | case FKVPairTypeBOOL: { 163 | dataLength = (NSUInteger)sizeof(BOOL); 164 | [dataM appendBytes:&dataLength length:sizeof(NSUInteger)]; 165 | 166 | BOOL data = self.boolVal; 167 | [dataM appendBytes:[self.objcType UTF8String] length:objcTypeLength]; 168 | [dataM appendBytes:[self.key UTF8String] length:keyLength]; 169 | [dataM appendBytes:&data length:dataLength]; 170 | break; 171 | } 172 | case FKVPairTypeInt32: { 173 | dataLength = (NSUInteger)sizeof(int32_t); 174 | [dataM appendBytes:&dataLength length:sizeof(NSUInteger)]; 175 | 176 | int32_t data = self.int32Val; 177 | [dataM appendBytes:[self.objcType UTF8String] length:objcTypeLength]; 178 | [dataM appendBytes:[self.key UTF8String] length:keyLength]; 179 | [dataM appendBytes:&data length:dataLength]; 180 | break; 181 | } 182 | case FKVPairTypeInt64: { 183 | dataLength = (NSUInteger)sizeof(int64_t); 184 | [dataM appendBytes:&dataLength length:sizeof(NSUInteger)]; 185 | 186 | int64_t data = self.int64Val; 187 | [dataM appendBytes:[self.objcType UTF8String] length:objcTypeLength]; 188 | [dataM appendBytes:[self.key UTF8String] length:keyLength]; 189 | [dataM appendBytes:&data length:dataLength]; 190 | break; 191 | } 192 | case FKVPairTypeFloat: { 193 | dataLength = (NSUInteger)sizeof(float); 194 | [dataM appendBytes:&dataLength length:sizeof(NSUInteger)]; 195 | 196 | float data = self.floatVal; 197 | [dataM appendBytes:[self.objcType UTF8String] length:objcTypeLength]; 198 | [dataM appendBytes:[self.key UTF8String] length:keyLength]; 199 | [dataM appendBytes:&data length:dataLength]; 200 | break; 201 | } 202 | case FKVPairTypeDouble: { 203 | dataLength = (NSUInteger)sizeof(double); 204 | [dataM appendBytes:&dataLength length:sizeof(NSUInteger)]; 205 | 206 | float data = self.doubleVal; 207 | [dataM appendBytes:[self.objcType UTF8String] length:objcTypeLength]; 208 | [dataM appendBytes:[self.key UTF8String] length:keyLength]; 209 | [dataM appendBytes:&data length:dataLength]; 210 | break; 211 | } 212 | case FKVPairTypeString: { 213 | dataLength = self.stringVal.length; 214 | [dataM appendBytes:&dataLength length:sizeof(NSUInteger)]; 215 | 216 | NSString *data = self.stringVal; 217 | [dataM appendBytes:[self.objcType UTF8String] length:objcTypeLength]; 218 | [dataM appendBytes:[self.key UTF8String] length:keyLength]; 219 | [dataM appendBytes:[data UTF8String] length:dataLength]; 220 | break; 221 | } 222 | case FKVPairTypeData: { 223 | dataLength = self.binaryVal.length; 224 | [dataM appendBytes:&dataLength length:sizeof(NSUInteger)]; 225 | 226 | NSData *data = self.binaryVal; 227 | [dataM appendBytes:[self.objcType UTF8String] length:objcTypeLength]; 228 | [dataM appendBytes:[self.key UTF8String] length:keyLength]; 229 | [dataM appendData:data]; 230 | break; 231 | } 232 | } 233 | 234 | // CRC check code 235 | uint16_t crc = [dataM fkv_crc16]; 236 | [dataM appendBytes:&crc length:2]; 237 | 238 | return [dataM copy]; 239 | } 240 | 241 | - (BOOL)isEqual:(FKVPair *)object { 242 | if (![object isKindOfClass:[FKVPair class]]) { 243 | return NO; 244 | } 245 | BOOL result = YES; 246 | switch (self.valueType) { 247 | case FKVPairTypeRemoved: 248 | case FKVPairTypeNil: { 249 | return YES; 250 | break; 251 | } 252 | case FKVPairTypeBOOL: { 253 | result = result && (self.boolVal == object.boolVal); 254 | break; 255 | } 256 | case FKVPairTypeInt32: { 257 | result = result && (self.int32Val == object.int32Val); 258 | break; 259 | } 260 | case FKVPairTypeInt64: { 261 | result = result && (self.int64Val == object.int64Val); 262 | break; 263 | } 264 | case FKVPairTypeFloat: { 265 | result = result && (self.floatVal == object.floatVal); 266 | break; 267 | } 268 | case FKVPairTypeDouble: { 269 | result = result && (self.doubleVal == object.doubleVal); 270 | break; 271 | } 272 | case FKVPairTypeString: { 273 | result = result && [self.stringVal isEqualToString:object.stringVal]; 274 | break; 275 | } 276 | case FKVPairTypeData: { 277 | result = result && (self.binaryVal == object.binaryVal); 278 | break; 279 | } 280 | } 281 | if (!result) { 282 | return NO; 283 | } 284 | result = result && (self.valueType == object.valueType); 285 | return result; 286 | } 287 | @end 288 | 289 | @implementation FKVPairList 290 | + (FKVPairList *)parseFromData:(NSData *)data error:(NSError *__autoreleasing *)error { 291 | NSUInteger len = data.length; 292 | NSData *delimiterData = [NSData dataWithBytes:FastKVSeperatorString length:strlen(FastKVSeperatorString)]; 293 | 294 | FKVPairList *kvList = [[FKVPairList alloc] init]; 295 | 296 | NSRange delimiterRange = NSMakeRange(0, 0); 297 | NSUInteger splitStartIndex = 0; 298 | while (YES) { 299 | delimiterRange = [data rangeOfData:delimiterData options:kNilOptions range:NSMakeRange(splitStartIndex, len - splitStartIndex)]; 300 | if (delimiterRange.location == NSNotFound) { 301 | break; 302 | } 303 | FKVPair *kv = [FKVPair parseFromData:[data subdataWithRange:NSMakeRange(splitStartIndex, delimiterRange.location - splitStartIndex)] error:error]; 304 | if (kv) { 305 | [kvList.items addObject:kv]; 306 | } 307 | splitStartIndex = delimiterRange.location + delimiterRange.length; 308 | } 309 | 310 | return kvList; 311 | } 312 | 313 | - (instancetype)init { 314 | self = [super init]; 315 | if (self) { 316 | _items = [NSMutableArray array]; 317 | } 318 | return self; 319 | } 320 | 321 | - (NSData *)representationData { 322 | NSMutableData *data = [NSMutableData data]; 323 | [self.items enumerateObjectsUsingBlock:^(FKVPair * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 324 | [data appendData:[obj representationData]]; 325 | [data appendBytes:FastKVSeperatorString length:strlen(FastKVSeperatorString)]; 326 | }]; 327 | return data; 328 | } 329 | @end 330 | 331 | @implementation NSData (FKVPair) 332 | 333 | - (uint16_t)fkv_crc16 { 334 | const uint8_t *byte = (const uint8_t *)self.bytes; 335 | uint16_t length = (uint16_t)self.length; 336 | return fkv_gen_crc16(byte, length); 337 | } 338 | 339 | #define FKVPairCRCPLOY 0X1021 340 | uint16_t fkv_gen_crc16(const uint8_t *data, uint16_t size) { 341 | uint16_t crc = 0; 342 | uint8_t i; 343 | for (; size > 0; size--) { 344 | crc = crc ^ (*data++ <<8); 345 | for (i = 0; i < 8; i++) { 346 | if (crc & 0X8000) { 347 | crc = (crc << 1) ^ FKVPairCRCPLOY; 348 | }else { 349 | crc <<= 1; 350 | } 351 | } 352 | crc &= 0XFFFF; 353 | } 354 | return crc; 355 | } 356 | @end 357 | -------------------------------------------------------------------------------- /FastKV/Classes/FastKV.h: -------------------------------------------------------------------------------- 1 | // 2 | // FastKV.h 3 | // FastKV 4 | // 5 | // Created by Yao Li on 2018/8/9. 6 | // 7 | 8 | #import 9 | 10 | extern const char * FastKVSeperatorString; 11 | 12 | extern NSString * const FastKVErrorDomain; 13 | 14 | typedef NS_ENUM(NSUInteger, FastKVError) { 15 | FastKVErrorOpenFailed = 4001, 16 | FastKVErrorReadFileFailed = 4002, 17 | FastKVErrorFileFormatError = 4003, 18 | FastKVErrorFileCorrupted = 4004, 19 | }; 20 | 21 | typedef NS_ENUM(NSUInteger, FastKVMemoryStrategy) { 22 | FastKVMemoryStrategyDefault = 0, 23 | FastKVMemoryStrategy1, 24 | }; 25 | 26 | @class FastKV; 27 | 28 | @protocol FastKVDelegate 29 | - (void)fastkv:(FastKV *)fastkv fileError:(NSError *)error; 30 | @end 31 | 32 | @interface FastKV : NSObject 33 | @property (weak, nonatomic) id delegate; 34 | 35 | + (instancetype)defaultFastKV; 36 | 37 | - (instancetype)initWithFile:(NSString *)path; 38 | - (instancetype)initWithFile:(NSString *)path 39 | memStrategy:(FastKVMemoryStrategy)memStrategy 40 | initialMemorySize:(size_t)initialMemorySize NS_DESIGNATED_INITIALIZER; 41 | 42 | - (BOOL)boolForKey:(NSString *)key; 43 | - (NSInteger)integerForKey:(NSString *)key; 44 | - (float)floatForKey:(NSString *)key; 45 | - (double)doubleForKey:(NSString *)key; 46 | - (nullable id)objectOfClass:(Class)cls forKey:(NSString *)key; 47 | 48 | - (void)setBool:(BOOL)val forKey:(NSString *)key; 49 | - (void)setInteger:(NSInteger)intval forKey:(NSString *)key; 50 | - (void)setFloat:(float)val forKey:(NSString *)key; 51 | - (void)setDouble:(double)val forKey:(NSString *)key; 52 | - (void)setObject:(nullable id)obj forKey:(NSString *)key; 53 | 54 | - (void)removeObjectForKey:(NSString *)key; 55 | 56 | - (void)removeAllKeys; 57 | 58 | /** 59 | Clean up local file when file error occurs. 60 | */ 61 | - (void)cleanUp; 62 | @end 63 | -------------------------------------------------------------------------------- /FastKV/Classes/FastKV.m: -------------------------------------------------------------------------------- 1 | // 2 | // FastKV.m 3 | // FastKV 4 | // 5 | // Created by Yao Li on 2018/8/9. 6 | // 7 | 8 | #import "FastKV.h" 9 | #import "FKVPair.h" 10 | #import 11 | #import 12 | #import 13 | 14 | // public const 15 | const char * FastKVSeperatorString = "$FastKVSeperatorString$"; 16 | 17 | NSString * const FastKVErrorDomain = @"com.fastkv.error"; 18 | 19 | // private const 20 | static size_t FastKVDefaultInitialMMSize = 1024 * 1024; 21 | static NSString *const FastKVMarkString = @"FastKV"; 22 | static uint32_t FastKVVersion = 1; // mmkv file format version 23 | static size_t FastKVHeaderSize = 18; // sizeof("FastKV") + version: sizeof(uint32_t) + dataLength: sizeof(uint64_t) 24 | 25 | static NSString * const FastKVObjcClassNameNSNumber = @"NSNumber"; 26 | 27 | @interface FastKV () { 28 | int _fd; 29 | void *_mmptr; 30 | size_t _mmsize; 31 | size_t _cursize; 32 | size_t _initialMMSize; 33 | 34 | NSString *_path; 35 | FastKVMemoryStrategy _memStrategy; 36 | 37 | NSMutableDictionary *_dict; 38 | pthread_mutex_t _mutexLock; 39 | 40 | } 41 | @end 42 | 43 | @implementation FastKV 44 | static FastKV *defaultInstacnce; 45 | + (instancetype)defaultFastKV { 46 | static dispatch_once_t onceToken; 47 | dispatch_once(&onceToken, ^{ 48 | NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject; 49 | path = [path stringByAppendingPathComponent:@"default.fkv"]; 50 | defaultInstacnce = [[self alloc] initWithFile:path]; 51 | }); 52 | return defaultInstacnce; 53 | } 54 | 55 | - (instancetype)init { 56 | [NSException raise:@"FastKVException" format:@"Can initialize FastKV via -init"]; 57 | if ([self initWithFile:nil]) { 58 | return nil; 59 | } 60 | return nil; 61 | } 62 | 63 | - (instancetype)initWithFile:(NSString *)path 64 | memStrategy:(FastKVMemoryStrategy)memStrategy 65 | initialMemorySize:(size_t)initialMemorySize { 66 | self = [super init]; 67 | if (self) { 68 | NSError *error = nil; 69 | if (![[NSFileManager defaultManager] createDirectoryAtPath:[path stringByDeletingLastPathComponent] 70 | withIntermediateDirectories:YES 71 | attributes:nil 72 | error:&error]) { 73 | return nil; 74 | } 75 | _path = path; 76 | _memStrategy = memStrategy; 77 | _initialMMSize = initialMemorySize; 78 | 79 | pthread_mutex_init(&_mutexLock, NULL); 80 | 81 | if(![self open:path]) { 82 | return nil; 83 | } 84 | } 85 | return self; 86 | } 87 | 88 | - (instancetype)initWithFile:(NSString *)path { 89 | return [self initWithFile:path memStrategy:FastKVMemoryStrategyDefault initialMemorySize:FastKVDefaultInitialMMSize]; 90 | } 91 | 92 | - (BOOL)open:(NSString *)file { 93 | pthread_mutex_lock(&_mutexLock); 94 | _fd = open([file fileSystemRepresentation], O_RDWR | O_CREAT, 0666); 95 | if (_fd == 0) { 96 | pthread_mutex_unlock(&_mutexLock); 97 | if ([self.delegate respondsToSelector:@selector(fastkv:fileError:)]) { 98 | [self.delegate fastkv:self fileError:[NSError errorWithDomain:FastKVErrorDomain code:FastKVErrorOpenFailed userInfo:nil]]; 99 | } 100 | NSCAssert(NO, @"[FastKV] Failed to open file: %@", file); 101 | return NO; 102 | } 103 | 104 | struct stat statInfo; 105 | if(fstat(_fd, &statInfo) != 0) { 106 | pthread_mutex_unlock(&_mutexLock); 107 | if ([self.delegate respondsToSelector:@selector(fastkv:fileError:)]) { 108 | [self.delegate fastkv:self fileError:[NSError errorWithDomain:FastKVErrorDomain code:FastKVErrorReadFileFailed userInfo:nil]]; 109 | } 110 | NSCAssert(NO, @"[FastKV] Failed to read file stat: %@", file); 111 | return NO; 112 | } 113 | 114 | if (![self reallocMMSizeWithNeededSize:statInfo.st_size]) { 115 | pthread_mutex_unlock(&_mutexLock); 116 | return NO; 117 | } 118 | 119 | _dict = [NSMutableDictionary dictionary]; 120 | if (statInfo.st_size == 0) { 121 | [self resetHeaderWithContentSize:0]; 122 | _cursize = FastKVHeaderSize; 123 | pthread_mutex_unlock(&_mutexLock); 124 | return YES; 125 | } 126 | 127 | char *ptr = (char *)_mmptr; 128 | // read mark string 129 | NSData *data = [NSData dataWithBytes:ptr length:6]; 130 | if (![FastKVMarkString isEqualToString:[NSString stringWithUTF8String:(const char *)data.bytes]]) { 131 | pthread_mutex_unlock(&_mutexLock); 132 | if ([self.delegate respondsToSelector:@selector(fastkv:fileError:)]) { 133 | [self.delegate fastkv:self fileError:[NSError errorWithDomain:FastKVErrorDomain code:FastKVErrorFileFormatError userInfo:nil]]; 134 | } 135 | NSCAssert(NO, @"[FastKV] Not FastKV file: %@", file); 136 | return NO; 137 | } 138 | // read version 139 | ptr += 6; 140 | data = [NSData dataWithBytes:ptr length:4]; 141 | uint32_t ver = 0; 142 | [data getBytes:&ver length:4]; 143 | 144 | // read data-length 145 | ptr += 4; 146 | data = [NSData dataWithBytes:ptr length:8]; 147 | uint64_t dataLength = 0; 148 | [data getBytes:&dataLength length:8]; 149 | if (dataLength + FastKVHeaderSize > statInfo.st_size) { 150 | pthread_mutex_unlock(&_mutexLock); 151 | if ([self.delegate respondsToSelector:@selector(fastkv:fileError:)]) { 152 | [self.delegate fastkv:self fileError:[NSError errorWithDomain:FastKVErrorDomain code:FastKVErrorFileCorrupted userInfo:nil]]; 153 | } 154 | NSCAssert(NO, @"[FastKV] Illegal file size"); 155 | return NO; 156 | } 157 | 158 | // read data 159 | ptr += 8; 160 | data = [NSData dataWithBytes:ptr length:MIN(dataLength, statInfo.st_size - FastKVHeaderSize)]; 161 | NSError *error; 162 | FKVPairList *kvlist = [FKVPairList parseFromData:data error:&error]; 163 | for (FKVPair *item in kvlist.items) { 164 | if (item.key != nil && item.valueType != FKVPairTypeRemoved) { 165 | _dict[item.key] = item; 166 | } else if (item.valueType == FKVPairTypeRemoved) { 167 | [_dict removeObjectForKey:item.key]; 168 | } 169 | } 170 | [self reallocWithExtraSize:0]; 171 | pthread_mutex_unlock(&_mutexLock); 172 | return YES; 173 | } 174 | 175 | #pragma mark - primitive types 176 | - (BOOL)boolForKey:(NSString *)key { 177 | FKVPair *kv = [self _itemForKey:key]; 178 | id val = [self _numberValue:kv]; 179 | if (val == nil) { 180 | if (kv.valueType == FKVPairTypeString) { 181 | val = kv.stringVal; 182 | } 183 | } 184 | return [val boolValue]; 185 | } 186 | 187 | - (NSInteger)integerForKey:(NSString *)key { 188 | FKVPair *kv = [self _itemForKey:key]; 189 | id val = [self _numberValue:kv]; 190 | if (val == nil) { 191 | if (kv.valueType == FKVPairTypeString) { 192 | val = kv.stringVal; 193 | } 194 | } 195 | return [val integerValue]; 196 | } 197 | 198 | - (float)floatForKey:(NSString *)key { 199 | FKVPair *kv = [self _itemForKey:key]; 200 | id val = [self _numberValue:kv]; 201 | if (val == nil) { 202 | if (kv.valueType == FKVPairTypeString) { 203 | val = kv.stringVal; 204 | } 205 | } 206 | return [val floatValue]; 207 | } 208 | 209 | - (double)doubleForKey:(NSString *)key { 210 | FKVPair *kv = [self _itemForKey:key]; 211 | id val = [self _numberValue:kv]; 212 | if (val == nil) { 213 | if (kv.valueType == FKVPairTypeString) { 214 | val = kv.stringVal; 215 | } 216 | } 217 | return [val doubleValue]; 218 | } 219 | 220 | #pragma mark - read: ObjC objects 221 | - (id)objectOfClass:(Class)cls forKey:(NSString *)key { 222 | FKVPair *kv = [self _itemForKey:key]; 223 | Class octype = [self _objCType:kv]; 224 | 225 | #ifndef CASE_CLASS 226 | #define CASE_CLASS(cls, type) if (cls == type.class || [cls isSubclassOfClass:type.class]) 227 | #endif 228 | 229 | CASE_CLASS(cls, NSNumber) { 230 | return [self _numberValue:kv]; 231 | } 232 | CASE_CLASS(cls, NSString) { 233 | return kv.stringVal; 234 | } 235 | CASE_CLASS(cls, NSData) { 236 | if (kv.valueType == FKVPairTypeData) { 237 | return kv.binaryVal; 238 | } 239 | return nil; 240 | } 241 | CASE_CLASS(cls, NSDate) { 242 | CASE_CLASS(octype, NSDate) { 243 | id val = [self _unarchiveValueForClass:NSDate.class fromItem:kv]; 244 | if (val == nil) { 245 | val = [self _numberValue:kv]; 246 | return val ? [NSDate dateWithTimeIntervalSince1970:[val doubleValue]] : nil; 247 | } 248 | return val; 249 | } 250 | return nil; 251 | } 252 | CASE_CLASS(cls, NSURL) { 253 | CASE_CLASS(octype, NSURL) { 254 | id val = [self _unarchiveValueForClass:NSURL.class fromItem:kv]; 255 | if (val == nil && kv.valueType == FKVPairTypeString) { 256 | return [NSURL URLWithString:kv.stringVal]; 257 | } 258 | return val; 259 | } 260 | return nil; 261 | } 262 | 263 | return [self _unarchiveValueForClass:octype fromItem:kv]; 264 | } 265 | 266 | #pragma mark - set: primitive types 267 | - (void)setBool:(BOOL)val forKey:(NSString *)key { 268 | FKVPair *kv = [[FKVPair alloc] initWithValueType:FKVPairTypeBOOL objcType:FastKVObjcClassNameNSNumber key:key version:FastKVVersion]; 269 | kv.boolVal = val; 270 | [self append:kv]; 271 | } 272 | 273 | - (void)setInteger:(NSInteger)intval forKey:(NSString *)key { 274 | FKVPair *kv = [[FKVPair alloc] initWithValueType:FKVPairTypeNil objcType:FastKVObjcClassNameNSNumber key:key version:FastKVVersion]; 275 | if (intval > INT_MAX) { 276 | kv.int64Val = (int64_t)intval; 277 | kv.valueType = FKVPairTypeInt64; 278 | } else { 279 | kv.int32Val = (int32_t)intval; 280 | kv.valueType = FKVPairTypeInt32; 281 | } 282 | [self append:kv]; 283 | } 284 | 285 | - (void)setFloat:(float)val forKey:(NSString *)key { 286 | FKVPair *kv = [[FKVPair alloc] initWithValueType:FKVPairTypeFloat objcType:FastKVObjcClassNameNSNumber key:key version:FastKVVersion]; 287 | kv.floatVal = val; 288 | [self append:kv]; 289 | } 290 | 291 | - (void)setDouble:(double)val forKey:(NSString *)key { 292 | FKVPair *kv = [[FKVPair alloc] initWithValueType:FKVPairTypeDouble objcType:FastKVObjcClassNameNSNumber key:key version:FastKVVersion]; 293 | kv.doubleVal = val; 294 | [self append:kv]; 295 | } 296 | 297 | - (void)setObject:(id)obj forKey:(NSString *)key { 298 | if (obj == nil) { 299 | FKVPair *kv = [[FKVPair alloc] init]; 300 | kv.fkv_version = FastKVVersion; 301 | kv.valueType = FKVPairTypeNil; 302 | kv.key = key; 303 | [self append:kv]; 304 | return; 305 | } 306 | 307 | FKVPair *kv = [[FKVPair alloc] init]; 308 | kv.fkv_version = FastKVVersion; 309 | kv.key = key; 310 | kv.objcType = NSStringFromClass([obj class]); 311 | 312 | if ([obj isKindOfClass:[NSString class]]) { 313 | kv.stringVal = (NSString *)obj; 314 | kv.valueType = FKVPairTypeString; 315 | } else if ([obj isKindOfClass:[NSData class]]) { 316 | kv.binaryVal = (NSData *)obj; 317 | kv.valueType = FKVPairTypeData; 318 | } else if ([obj isKindOfClass:[NSDate class]]) { 319 | kv.doubleVal = [((NSDate *)obj) timeIntervalSince1970]; 320 | kv.valueType = FKVPairTypeDouble; 321 | } else if ([obj isKindOfClass:[NSURL class]]) { 322 | kv.stringVal = [(NSURL *)obj absoluteString]; 323 | kv.valueType = FKVPairTypeString; 324 | } else { 325 | kv.binaryVal = [NSKeyedArchiver archivedDataWithRootObject:obj]; // should throw if exception. 326 | kv.valueType = FKVPairTypeData; 327 | } 328 | 329 | [self append:kv]; 330 | } 331 | 332 | - (void)removeObjectForKey:(NSString *)key { 333 | FKVPair *kv = [[FKVPair alloc] init]; 334 | kv.fkv_version = FastKVVersion; 335 | kv.valueType = FKVPairTypeRemoved; 336 | kv.key = key; 337 | [self append:kv]; 338 | } 339 | 340 | - (void)removeAllKeys { 341 | pthread_mutex_lock(&_mutexLock); 342 | 343 | [_dict removeAllObjects]; 344 | munmap(_mmptr, _mmsize); 345 | [self mapWithSize:_initialMMSize]; 346 | [self resetHeaderWithContentSize:0]; 347 | 348 | pthread_mutex_unlock(&_mutexLock); 349 | } 350 | 351 | - (void)cleanUp { 352 | pthread_mutex_lock(&_mutexLock); 353 | if (_mmptr) { 354 | munmap(_mmptr, _cursize); 355 | } 356 | if (_fd) { 357 | ftruncate(_fd, _cursize); 358 | close(_fd); 359 | } 360 | _mmsize = 0; 361 | _cursize = 0; 362 | [_dict removeAllObjects]; 363 | 364 | [[NSFileManager defaultManager] removeItemAtPath:_path error:NULL]; 365 | NSError *error = nil; 366 | if (![[NSFileManager defaultManager] createDirectoryAtPath:[_path stringByDeletingLastPathComponent] 367 | withIntermediateDirectories:YES 368 | attributes:nil 369 | error:&error]) { 370 | return; 371 | } 372 | pthread_mutex_unlock(&_mutexLock); 373 | 374 | [self open:_path]; 375 | } 376 | 377 | #pragma mark - private 378 | - (void)resetHeaderWithContentSize:(uint64_t)dataLength { 379 | char *ptr = (char *)_mmptr; 380 | memcpy(ptr, [FastKVMarkString dataUsingEncoding:NSUTF8StringEncoding].bytes, 6); 381 | ptr += 6; 382 | memcpy(ptr, &FastKVVersion, 4); 383 | ptr += 4; 384 | memcpy(ptr, &dataLength, 8); 385 | } 386 | 387 | - (void)append:(FKVPair *)item { 388 | pthread_mutex_lock(&_mutexLock); 389 | BOOL isUpdated = NO; 390 | 391 | if (_dict[item.key]) { 392 | isUpdated = YES; 393 | FKVPair *aItem = _dict[item.key]; 394 | if ([aItem isEqual:item]) { 395 | pthread_mutex_unlock(&_mutexLock); 396 | return; 397 | } 398 | } 399 | 400 | if (item.valueType != FKVPairTypeRemoved) { 401 | _dict[item.key] = item; 402 | } else { 403 | [_dict removeObjectForKey:item.key]; 404 | } 405 | 406 | NSMutableData *data = [NSMutableData data]; 407 | [data appendData:[item representationData]]; 408 | [data appendBytes:FastKVSeperatorString length:strlen(FastKVSeperatorString)]; 409 | 410 | if (data.length + _cursize >= _mmsize) { 411 | [self reallocWithExtraSize:data.length updated:isUpdated]; 412 | } else { 413 | memcpy((char *)_mmptr + _cursize, data.bytes, data.length); 414 | _cursize += data.length; 415 | 416 | uint64_t dataLength = _cursize - FastKVHeaderSize; 417 | memcpy((char *)_mmptr + sizeof(uint32_t) + [FastKVMarkString lengthOfBytesUsingEncoding:NSUTF8StringEncoding], &dataLength, 8); 418 | } 419 | pthread_mutex_unlock(&_mutexLock); 420 | } 421 | 422 | - (BOOL)mapWithSize:(size_t)mapSize { 423 | size_t mmsize = MAX(mapSize, _initialMMSize); 424 | _mmptr = mmap(NULL, mmsize, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, _fd, 0); 425 | if (_mmptr == MAP_FAILED) { 426 | NSCAssert(NO, @"[FastKV] Create mmap failed: %d", errno); 427 | return NO; 428 | } 429 | ftruncate(_fd, mmsize); 430 | _mmsize = mmsize; 431 | return YES; 432 | } 433 | 434 | - (void)reallocWithExtraSize:(size_t)size updated:(BOOL)updated { 435 | FKVPairList *kvlist = [[FKVPairList alloc] init]; 436 | for (FKVPair *item in _dict.allValues) { 437 | if (item.valueType != FKVPairTypeRemoved) { 438 | [kvlist.items addObject:item]; 439 | } 440 | } 441 | NSData *data = [kvlist representationData]; 442 | NSUInteger dataLength = data.length; 443 | 444 | size_t totalSize = dataLength + FastKVHeaderSize; 445 | size_t neededSize = updated ? [self _fkvAllocationSizeWithNeededSize:totalSize + size] : totalSize + size; 446 | if (neededSize > _mmsize 447 | || (updated && [self _fkvAllocationSizeWithNeededSize:neededSize] > _mmsize)) { 448 | munmap(_mmptr, _mmsize); 449 | [self reallocMMSizeWithNeededSize:neededSize]; 450 | [self resetHeaderWithContentSize:0]; 451 | } 452 | memcpy((char *)_mmptr + FastKVHeaderSize, data.bytes, dataLength); 453 | memcpy((char *)_mmptr + 10, &dataLength, 8); 454 | _cursize = dataLength + FastKVHeaderSize; 455 | } 456 | 457 | - (void)reallocWithExtraSize:(size_t)size { 458 | [self reallocWithExtraSize:size updated:NO]; 459 | } 460 | 461 | - (BOOL)reallocMMSizeWithNeededSize:(size_t)neededSize { 462 | size_t allocationSize = neededSize; 463 | allocationSize = [self _fkvAllocationSizeWithNeededSize:neededSize]; 464 | return [self mapWithSize:allocationSize]; 465 | } 466 | 467 | - (size_t)_fkvAllocationSizeWithNeededSize:(size_t)neededSize { 468 | size_t allocationSize = neededSize; 469 | switch (_memStrategy) { 470 | case FastKVMemoryStrategyDefault: { 471 | allocationSize = FastKVStrategyDefaultAllocationSizeWithNeededSize(neededSize); 472 | break; 473 | } 474 | case FastKVMemoryStrategy1: { 475 | allocationSize = FastKVStrategy1AllocationSizeWithNeededSize(neededSize); 476 | break; 477 | } 478 | } 479 | return allocationSize; 480 | } 481 | 482 | static inline size_t FastKVStrategyDefaultAllocationSizeWithNeededSize(size_t neededSize) { 483 | size_t allocationSize = 1; 484 | while (allocationSize <= neededSize) { 485 | allocationSize *= 2; 486 | } 487 | return allocationSize; 488 | } 489 | 490 | static inline size_t FastKVStrategy1AllocationSizeWithNeededSize(size_t neededSize) { 491 | size_t allocationSize = (neededSize >> 3) + (neededSize < 9 ? 3 : 6); 492 | return allocationSize + neededSize; 493 | } 494 | 495 | - (FKVPair *)_itemForKey:(NSString *)key { 496 | pthread_mutex_lock(&_mutexLock); 497 | 498 | FKVPair *kv = _dict[key]; 499 | 500 | pthread_mutex_unlock(&_mutexLock); 501 | return kv; 502 | } 503 | 504 | - (Class)_objCType:(FKVPair *)kv { 505 | if (kv.objcType) { 506 | return NSClassFromString(kv.objcType); 507 | } 508 | return nil; 509 | } 510 | 511 | - (NSNumber *)_numberValue:(FKVPair *)kv{ 512 | if (!kv) { 513 | return nil; 514 | } 515 | switch (kv.valueType) { 516 | case FKVPairTypeBOOL: return @(kv.boolVal); 517 | case FKVPairTypeInt32: return @(kv.int32Val); 518 | case FKVPairTypeInt64: return @(kv.int64Val); 519 | case FKVPairTypeFloat: return @(kv.floatVal); 520 | case FKVPairTypeDouble: return @(kv.doubleVal); 521 | case FKVPairTypeData: 522 | return [self _unarchiveValueForClass:[NSNumber class] fromItem:kv]; 523 | default: return nil; 524 | } 525 | } 526 | 527 | - (id)_unarchiveValueForClass:(Class)cls fromItem:(FKVPair *)kv { 528 | if (kv.valueType == FKVPairTypeData) { 529 | @try { 530 | id val = [NSKeyedUnarchiver unarchiveObjectWithData:kv.binaryVal]; 531 | return [val isKindOfClass:cls] ? val : nil; 532 | } @catch (NSException *e) { 533 | return nil; 534 | } 535 | } 536 | return nil; 537 | } 538 | @end 539 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018 yao.li 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FastKV 2 | [![Platform](https://img.shields.io/cocoapods/p/TinyPart.svg?style=flat)](https://cocoapods.org/?q=tinypart) 3 | [![Version](https://img.shields.io/cocoapods/v/FastKV.svg?style=flat)](https://cocoapods.org/pods/FastKV) 4 | [![License MIT](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://github.com/RyanLeeLY/TinyPart/blob/master/LICENSE) 5 | [![Gmail](https://img.shields.io/badge/Gmail-@liyaoxjtu2013-red.svg?style=flat)](mail://liyaoxjtu2013@gmail.com) 6 | [![Twitter](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/liyaoryan) 7 | 8 | [中文介绍](https://github.com/RyanLeeLY/FastKV/blob/master/iOS的高性能、高实时性key-value持久化组件.md) 9 | 10 | ## Usage 11 | ``` 12 | [[FastKV defaultFastKV] setBool:YES forKey:@"key"]; 13 | [[FastKV defaultFastKV] setInteger:1 forKey:@"key"]; 14 | [[FastKV defaultFastKV] setObject:@"value" forKey:@"key"]; 15 | 16 | [[FastKV defaultFastKV] boolForKey:@"key"]; 17 | [[FastKV defaultFastKV] integerForKey:@"key"]; 18 | [[FastKV defaultFastKV] objectOfClass:NSString.class forKey:@"key"]; 19 | ``` 20 | 21 | ## Memory Allocation 22 | `FastKV` provides two kinds of memory allocation strategy. 23 | 24 | ``` 25 | typedef NS_ENUM(NSUInteger, FastKVMemoryStrategy) { 26 | FastKVMemoryStrategyDefault = 0, 27 | FastKVMemoryStrategy1, 28 | }; 29 | ``` 30 | 31 | **Doubling** `FastKVMemoryStrategyDefault` 32 | 33 | ``` 34 | size_t allocationSize = 1; 35 | while (allocationSize <= neededSize) { 36 | allocationSize *= 2; 37 | } 38 | return allocationSize; 39 | ``` 40 | 41 | **Linear** `FastKVMemoryStrategy1 ` 42 | 43 | Reference [python list](https://svn.python.org/projects/python/trunk/Objects/listobject.c) 44 | 45 | ``` 46 | size_t allocationSize = (neededSize >> 3) + (neededSize < 9 ? 3 : 6); 47 | return allocationSize + neededSize; 48 | ``` 49 | 50 | ## Installation 51 | 52 | FastKV is available through [CocoaPods](https://cocoapods.org). To install 53 | it, simply add the following line to your Podfile: 54 | 55 | ```ruby 56 | pod 'FastKV' 57 | ``` 58 | 59 | ## Benchmark 60 | iPhone 8 64G, iOS 11.4 61 | 62 | **Time taken of 10,000 write operations, unit: ms** 63 | 64 | ![Benchmark](https://github.com/RyanLeeLY/FastKV/raw/master/benchmark.jpeg) 65 | 66 | 67 | ## Author 68 | 69 | yao.li, liyaoxjtu2013@gmail.com 70 | 71 | ## License 72 | 73 | FastKV is available under the [MIT](https://github.com/RyanLeeLY/FastKV/blob/master/LICENSE) license. See the LICENSE file for more info. 74 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj -------------------------------------------------------------------------------- /benchmark.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RyanLeeLY/FastKV/98aeffacee53a101e473e110955e75d0d5f7260f/benchmark.jpeg -------------------------------------------------------------------------------- /iOS的高性能、高实时性key-value持久化组件.md: -------------------------------------------------------------------------------- 1 | > 今年上半年时候看到微信开发团队的这么一篇文章[MMKV--基于 mmap 的 iOS 高性能通用 key-value 组件](https://mp.weixin.qq.com/s/cZQ3FQxRJBx4px1woBaasg),文中提到了用mmap实现一个高性能KV组件,虽然并没有展示太多的具体代码,但是基本思路讲的还是很清楚的。
文章最后提到了开源计划,等了快半年还没看到这个组件源码,于是决定自己试着写一个。 2 | 3 | ## 关于NSUserDefaults 4 | 5 | 在开始写这个组件之前,应该先调研一下NSUserDefaults性能(ps:这里有个失误,事实上我是在写完这个组件以后才调研的)。 6 | 7 | 据我所知NSUserDefaults有一层内存缓存的,所以它提供了一个叫`synchronize`的方法用于同步磁盘和缓存,但是这个方法现在苹果在文档中告诉我们`for any other reason: remove the synchronize call`,总之就是再也不需要调用这个方法了。 8 | 9 | 测试结果如下(写入1w次,值类型是NSInteger,环境:iPhone 8 64G, iOS 11.4) 10 | 11 | 非`synchronize`耗时:**137ms** 12 | 13 | `synchronize`耗时:**3758ms** 14 | 15 | 很明显`synchronize `对性能的损耗非常大,因为本文需要的是一个**高性能**、**高实时性**的key-value持久化组件,也就是说在一些极端情况下数据也需要能够被持久化,同时又不影响性能。所谓极端情况,比如说在App发生Crash的时候数据也能够被存储到磁盘中,并不会因为缓存和磁盘没来得及同步而造成数据丢失。 16 | 17 | 从数据上我们可以看到非`synchronize`下的性能还是挺好的,比上面那篇微信的文章中的测试结果貌似要好很多嘛。那么`mmap`和`NSUserDefaults`在高性能上的优势似乎并不明显的。 18 | 19 | 那么我们再来看一下**高实时性**这个方面。既然苹果在文档中告诉我们`remove the synchronize`,难道苹果已经解决的`NSUserDefaults`的高实时性和高性能兼顾的问题?抱着试一试的心态笔者做了一下测试,答案是否定的。在不使用`synchronize `的情况下,极端情况依旧会出现数据丢失的问题。那么我们的`mmap`还是有它的用武之地的,至少它在保证的高实时性的时候还兼顾到了性能问题。 20 | 21 | 为了便于更好的理解,在阅读接下来的部分前请先阅读这篇文章。[MMKV--基于 mmap 的 iOS 高性能通用 key-value 组件](https://mp.weixin.qq.com/s/cZQ3FQxRJBx4px1woBaasg) 22 | 23 | ## 数据序列化 24 | 25 | 具体的实现笔者还是参考了上面微信团队的MMKV,那篇文章已经讲得比较详细了,因此对那篇文章的分析在这里就不再展开了。 26 | 27 | 在这里要提到的一个点是有关于数据序列化。MMKV在序列化时使用了Google开源的`protobuf`,笔者在实现的时候考虑到各方面原因决定自定义一个内存数据格式,这样就避免了对`protobuf`的依赖。 28 | 29 | 自定义协议主要分为3个部分:Header Segment、Data Segment、Check Code。 30 | 31 | **Header Segment**: 32 | 33 | | 32/64bit | 32bit | 32/64bit | 32/64bit | 32/64bit | 34 | | ------ | ------ | ------ | ------ | ------ | 35 | | VALUE_TYPE | VERSION | OBJC_TYPE length | KEY length | DATA length | 36 | 37 | 这部分的长度是固定的,160bit或288bit。 38 | 39 | `VALUE_TYPE`:数据的类型,目前有8种类型bool、nil、int32、int64、float、double、string、data。 40 | 41 | `VERSION`:数据记录时的版本。 42 | 43 | `OBJC_TYPE length`:OC类名字符串的长度。 44 | 45 | `KEY length`:key的长度。 46 | 47 | `DATA length`:value的长度。 48 | 49 | **Data Segment**: 50 | 51 | | Data | Data | Data | 52 | | ------ | ------ | ------ | 53 | | OBJC_TYPE | KEY | DATA | 54 | 55 | `OBJC_TYPE`:OC类名的字符串。 56 | 57 | `KEY`:key。 58 | 59 | `DATA`:value。 60 | 61 | **Check Code**: 62 | 63 | | 16bit | 64 | | ------ | 65 | | CRC code | 66 | 67 | CRC code:倒数16位之前数据的CRC-16循环冗余检测码,用于后期数据校验。 68 | 69 | ## 空间增长 70 | 71 | ### 分配策略 72 | 73 | mmap的使用涉及一个内存空间的分配问题,我们在这里提供了两种内存分配策略。 74 | 75 | 一种策略是在MMKV的文章中提到,在append时遇到内存不够用的时候,会进行序列化排重。在序列化排重后还是不够用的话就将文件扩大一倍,直到够用。 76 | 77 | ```objective-c 78 | size_t allocationSize = 1; 79 | while (allocationSize <= neededSize) { 80 | allocationSize *= 2; 81 | } 82 | return allocationSize; 83 | ``` 84 | 85 | 另一种策略参考了[python list](https://svn.python.org/projects/python/trunk/Objects/listobject.c)的内存分配实现。 86 | 87 | ```objective-c 88 | size_t allocationSize = (neededSize >> 3) + (neededSize < 9 ? 3 : 6); 89 | return allocationSize + neededSize; 90 | ``` 91 | 92 | ### 内存抖动 93 | 94 | 在只考虑在添加新的key的情况下这两种内存分配策略比较好的,但是在多次更新key时可能会出现连续的排重操作,下面用一个例子来说明。 95 | 96 | 如果当前分配的`mmap size`仅仅只比当前正在使用的size多出极少极少一点,以至于接下来任何的append操作都会触发排重,但是由于每次都是对key进行更新操作,如果当前mmap的数据已经是最小集合了(没有任何重复key的数据),于是在排重完成后`mmap size`又刚好够用,不需要重新分配`mmap size`。这时候`mmap size`又是仅仅只比当前正在使用的size多出极少极少一点,然后任何的append又会走一遍上述逻辑。 97 | 98 | 为了解决这个问题,笔者在append操作的时候附加了一个逻辑:正常情况下`allocationSize`是按照当前实际`neededSize`来计算的,如果当前是对key进行更新操作,那么计算`allocationSize`会迭代两次,即第一次计算的`allocationSize`就是第二次计算中的`neededSize`。 99 | 100 | ``` objective-c 101 | size_t totalSize = dataLength + FastKVHeaderSize; 102 | size_t neededSize = updated ? [self _fkvAllocationSizeWithNeededSize:totalSize + size] : totalSize + size; 103 | if (neededSize > _mmsize 104 | || (updated && [self _fkvAllocationSizeWithNeededSize:neededSize] > _mmsize)) { 105 | // 重新分配mmap 106 | } 107 | ``` 108 | 109 | ## 其他优化 110 | 111 | 有一些OC对象的存储是可以优化的,比如NSDate、NSURL,在实际存储时可以当成double和NSString来进行序列化,既提高了性能又减少了空间的占用。 112 | 113 | ## 性能比较 114 | 115 | 测试结果如下(1w次,值类型是NSInteger,环境:iPhone 8 64G, iOS 11.4) 116 | 117 | add耗时:**70ms** (NSUserDefults Sync:**3469ms**) 118 | 119 | update耗时:**80ms** (NSUserDefults Sync:**3521ms**) 120 | 121 | get耗时:**10ms** (NSUserDefults:**48ms**) 122 | 123 | 测试下来mmap性能确实比`NSUserDefults Sync`要好不少,也和微信那篇文章中对MMKV的性能测试结果基本一致。总的来说,如果对实时性要求不高的项目,建议还是使用官方的`NSUserDefults `。 124 | 125 | ## 其他开源作品 126 | **TinyPart —模块化框架** 127 | [github](https://github.com/RyanLeeLY/TinyPart) 128 | 129 | **Coolog —可扩展的log框架** [github](https://github.com/RyanLeeLY/Coolog) 130 | 131 | **WhiteElephantKiller —无用代码扫描工具** [github](https://github.com/RyanLeeLY/WhiteElephantKiller) 132 | --------------------------------------------------------------------------------