[0.1.0] Example Model
This commit is contained in:
parent
4a1539e51b
commit
eafdba24f6
62
README.md
62
README.md
|
@ -1,8 +1,26 @@
|
|||
# SLazeKit
|
||||
|
||||
SLazeKit
|
||||
<p align="center">
|
||||
<a href="http://swift.org">
|
||||
<img src="https://img.shields.io/badge/Swift-4.0-brightgreen.svg" alt="Language" />
|
||||
</a>
|
||||
<a href="https://raw.githubusercontent.com/shial4/SLazeKit/master/LICENSE">
|
||||
<img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License" />
|
||||
</a>
|
||||
<a href="https://cocoapods.org/pods/SLazeKit">
|
||||
<img src="https://img.shields.io/cocoapods/v/SLazeKit.svg" alt="CocoaPods" />
|
||||
</a>
|
||||
<a href="https://github.com/Carthage/Carthage">
|
||||
<img src="https://img.shields.io/badge/carthage-compatible-4BC51D.svg?style=flat" alt="Carthage" />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
## 💊 Usage
|
||||
SLazeKit is an easy to use Swift restfull collection of extensions and classes. Don't spend hours writing your code to map your rest api request into models and coredata serialization. Stop wasting your time!
|
||||
|
||||
**SLazeKit allows you:**
|
||||
- map your models by `Codable` protocol
|
||||
- serialize `CoreData` models from API response
|
||||
- fast and simple extend your models with `API` & `CoreData`
|
||||
|
||||
## 🔧 Installation
|
||||
|
||||
|
@ -22,6 +40,46 @@ Clone the repo and drag the folder `SLazeKit` into your Xcode project.
|
|||
|
||||
Add the line `.package(url: "https://github.com/shial4/SLazeKit.git", from: "0.1.0"),` to your `Package.swift`
|
||||
|
||||
**Swift Package Manager in your iOS Project:**
|
||||
This project demonstrates a working method for using Swift Package Manager (SPM) to manage the dependencies of an iOS project.
|
||||
|
||||
<a href="https://github.com/j-channings/swift-package-manager-ios">Example of how to use SPM v4 to manage iOS dependencies</a>
|
||||
|
||||
## 💊 Usage
|
||||
|
||||
For positive experience, you should configure `SLazeKit` at first. This step is optional. You may leave it as it is default.
|
||||
|
||||
```swift
|
||||
import SLazeKit
|
||||
extension SLazeKit {
|
||||
//Provide base path for your API requests.
|
||||
open class var basePath?: String { return "www.yourdomain.com" }
|
||||
//Additional you can set port for your requests.
|
||||
open class var basePort: Int? { return 8040 }
|
||||
//You can provide your own instance of JSONDecoder.
|
||||
open class var decoder: JSONDecoder { return JSONDecoder() }
|
||||
//You can customize instance of URLSession in here.
|
||||
open class var urlSession: URLSession { return URLSession.shared }
|
||||
|
||||
//If you feel like to set header dor requests do it in here.
|
||||
open class func setup(_ request: URLRequest) -> URLRequest {
|
||||
var request: URLRequest = request
|
||||
request.setValue("Your token", forHTTPHeaderField: "X-Access-Token")
|
||||
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
||||
return request
|
||||
}
|
||||
//If you feel like to monitor response. You can do it in here.
|
||||
open class func handle(_ response: HTTPURLResponse?) {
|
||||
if response?.statusCode == 401 {
|
||||
Client.logout()
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Model example**
|
||||
[Model.swift](Tests/SLazeKitTests/Models/Model.swift)
|
||||
|
||||
## ⭐ Contributing
|
||||
|
||||
Be welcome to contribute to this project! :)
|
||||
|
|
|
@ -9,11 +9,11 @@
|
|||
/* Begin PBXAggregateTarget section */
|
||||
"SLazeKit::SLazeKitPackageTests::ProductTarget" /* SLazeKitPackageTests */ = {
|
||||
isa = PBXAggregateTarget;
|
||||
buildConfigurationList = OBJ_53 /* Build configuration list for PBXAggregateTarget "SLazeKitPackageTests" */;
|
||||
buildConfigurationList = OBJ_58 /* Build configuration list for PBXAggregateTarget "SLazeKitPackageTests" */;
|
||||
buildPhases = (
|
||||
);
|
||||
dependencies = (
|
||||
OBJ_56 /* PBXTargetDependency */,
|
||||
OBJ_61 /* PBXTargetDependency */,
|
||||
);
|
||||
name = SLazeKitPackageTests;
|
||||
productName = SLazeKitPackageTests;
|
||||
|
@ -21,28 +21,29 @@
|
|||
/* End PBXAggregateTarget section */
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
625513671FDFD27F00CFF484 /* StringInitializableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625513661FDFD27F00CFF484 /* StringInitializableTests.swift */; };
|
||||
OBJ_29 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_6 /* Package.swift */; };
|
||||
OBJ_35 /* SLazeKitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_20 /* SLazeKitTests.swift */; };
|
||||
OBJ_37 /* SLazeKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "SLazeKit::SLazeKit::Product" /* SLazeKit.framework */; };
|
||||
OBJ_44 /* Decodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* Decodable.swift */; };
|
||||
OBJ_45 /* NSManagedObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_11 /* NSManagedObject.swift */; };
|
||||
OBJ_46 /* NSManagedObjectContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* NSManagedObjectContext.swift */; };
|
||||
OBJ_47 /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_13 /* String.swift */; };
|
||||
OBJ_48 /* EntityMapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_15 /* EntityMapping.swift */; };
|
||||
OBJ_49 /* StringInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* StringInitializable.swift */; };
|
||||
OBJ_50 /* SLazeKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_17 /* SLazeKit.swift */; };
|
||||
OBJ_32 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_6 /* Package.swift */; };
|
||||
OBJ_38 /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_21 /* Model.swift */; };
|
||||
OBJ_39 /* SLazeKitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_22 /* SLazeKitTests.swift */; };
|
||||
OBJ_40 /* StringInitializableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_23 /* StringInitializableTests.swift */; };
|
||||
OBJ_42 /* SLazeKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "SLazeKit::SLazeKit::Product" /* SLazeKit.framework */; };
|
||||
OBJ_49 /* Decodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* Decodable.swift */; };
|
||||
OBJ_50 /* NSManagedObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_11 /* NSManagedObject.swift */; };
|
||||
OBJ_51 /* NSManagedObjectContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* NSManagedObjectContext.swift */; };
|
||||
OBJ_52 /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_13 /* String.swift */; };
|
||||
OBJ_53 /* EntityMapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_15 /* EntityMapping.swift */; };
|
||||
OBJ_54 /* StringInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* StringInitializable.swift */; };
|
||||
OBJ_55 /* SLazeKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_17 /* SLazeKit.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
625513641FDFD0C000CFF484 /* PBXContainerItemProxy */ = {
|
||||
629A48071FDFE0D4002DAD03 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = OBJ_1 /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = "SLazeKit::SLazeKit";
|
||||
remoteInfo = SLazeKit;
|
||||
};
|
||||
625513651FDFD0C000CFF484 /* PBXContainerItemProxy */ = {
|
||||
629A48081FDFE0D4002DAD03 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = OBJ_1 /* Project object */;
|
||||
proxyType = 1;
|
||||
|
@ -52,7 +53,6 @@
|
|||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
625513661FDFD27F00CFF484 /* StringInitializableTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringInitializableTests.swift; sourceTree = "<group>"; };
|
||||
OBJ_10 /* Decodable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Decodable.swift; sourceTree = "<group>"; };
|
||||
OBJ_11 /* NSManagedObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSManagedObject.swift; sourceTree = "<group>"; };
|
||||
OBJ_12 /* NSManagedObjectContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSManagedObjectContext.swift; sourceTree = "<group>"; };
|
||||
|
@ -60,22 +60,24 @@
|
|||
OBJ_15 /* EntityMapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntityMapping.swift; sourceTree = "<group>"; };
|
||||
OBJ_16 /* StringInitializable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringInitializable.swift; sourceTree = "<group>"; };
|
||||
OBJ_17 /* SLazeKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SLazeKit.swift; sourceTree = "<group>"; };
|
||||
OBJ_20 /* SLazeKitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SLazeKitTests.swift; sourceTree = "<group>"; };
|
||||
OBJ_21 /* Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = "<group>"; };
|
||||
OBJ_22 /* SLazeKitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SLazeKitTests.swift; sourceTree = "<group>"; };
|
||||
OBJ_23 /* StringInitializableTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringInitializableTests.swift; sourceTree = "<group>"; };
|
||||
OBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
|
||||
"SLazeKit::SLazeKit::Product" /* SLazeKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SLazeKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
"SLazeKit::SLazeKitTests::Product" /* SLazeKitTests.xctest */ = {isa = PBXFileReference; lastKnownFileType = file; path = SLazeKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
OBJ_36 /* Frameworks */ = {
|
||||
OBJ_41 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 0;
|
||||
files = (
|
||||
OBJ_37 /* SLazeKit.framework in Frameworks */,
|
||||
OBJ_42 /* SLazeKit.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
OBJ_51 /* Frameworks */ = {
|
||||
OBJ_56 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 0;
|
||||
files = (
|
||||
|
@ -105,14 +107,23 @@
|
|||
OBJ_19 /* SLazeKitTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
OBJ_20 /* SLazeKitTests.swift */,
|
||||
625513661FDFD27F00CFF484 /* StringInitializableTests.swift */,
|
||||
OBJ_20 /* Models */,
|
||||
OBJ_22 /* SLazeKitTests.swift */,
|
||||
OBJ_23 /* StringInitializableTests.swift */,
|
||||
);
|
||||
name = SLazeKitTests;
|
||||
path = Tests/SLazeKitTests;
|
||||
sourceTree = SOURCE_ROOT;
|
||||
};
|
||||
OBJ_21 /* Products */ = {
|
||||
OBJ_20 /* Models */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
OBJ_21 /* Model.swift */,
|
||||
);
|
||||
path = Models;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
OBJ_24 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
"SLazeKit::SLazeKitTests::Product" /* SLazeKitTests.xctest */,
|
||||
|
@ -127,7 +138,7 @@
|
|||
OBJ_6 /* Package.swift */,
|
||||
OBJ_7 /* Sources */,
|
||||
OBJ_18 /* Tests */,
|
||||
OBJ_21 /* Products */,
|
||||
OBJ_24 /* Products */,
|
||||
);
|
||||
name = "";
|
||||
sourceTree = "<group>";
|
||||
|
@ -167,10 +178,10 @@
|
|||
/* Begin PBXNativeTarget section */
|
||||
"SLazeKit::SLazeKit" /* SLazeKit */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = OBJ_40 /* Build configuration list for PBXNativeTarget "SLazeKit" */;
|
||||
buildConfigurationList = OBJ_45 /* Build configuration list for PBXNativeTarget "SLazeKit" */;
|
||||
buildPhases = (
|
||||
OBJ_43 /* Sources */,
|
||||
OBJ_51 /* Frameworks */,
|
||||
OBJ_48 /* Sources */,
|
||||
OBJ_56 /* Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
|
@ -183,15 +194,15 @@
|
|||
};
|
||||
"SLazeKit::SLazeKitTests" /* SLazeKitTests */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = OBJ_31 /* Build configuration list for PBXNativeTarget "SLazeKitTests" */;
|
||||
buildConfigurationList = OBJ_34 /* Build configuration list for PBXNativeTarget "SLazeKitTests" */;
|
||||
buildPhases = (
|
||||
OBJ_34 /* Sources */,
|
||||
OBJ_36 /* Frameworks */,
|
||||
OBJ_37 /* Sources */,
|
||||
OBJ_41 /* Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
OBJ_38 /* PBXTargetDependency */,
|
||||
OBJ_43 /* PBXTargetDependency */,
|
||||
);
|
||||
name = SLazeKitTests;
|
||||
productName = SLazeKitTests;
|
||||
|
@ -200,9 +211,9 @@
|
|||
};
|
||||
"SLazeKit::SwiftPMPackageDescription" /* SLazeKitPackageDescription */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = OBJ_25 /* Build configuration list for PBXNativeTarget "SLazeKitPackageDescription" */;
|
||||
buildConfigurationList = OBJ_28 /* Build configuration list for PBXNativeTarget "SLazeKitPackageDescription" */;
|
||||
buildPhases = (
|
||||
OBJ_28 /* Sources */,
|
||||
OBJ_31 /* Sources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
|
@ -228,7 +239,7 @@
|
|||
en,
|
||||
);
|
||||
mainGroup = OBJ_5 /* */;
|
||||
productRefGroup = OBJ_21 /* Products */;
|
||||
productRefGroup = OBJ_24 /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
|
@ -241,54 +252,55 @@
|
|||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
OBJ_28 /* Sources */ = {
|
||||
OBJ_31 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 0;
|
||||
files = (
|
||||
OBJ_29 /* Package.swift in Sources */,
|
||||
OBJ_32 /* Package.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
OBJ_34 /* Sources */ = {
|
||||
OBJ_37 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 0;
|
||||
files = (
|
||||
625513671FDFD27F00CFF484 /* StringInitializableTests.swift in Sources */,
|
||||
OBJ_35 /* SLazeKitTests.swift in Sources */,
|
||||
OBJ_38 /* Model.swift in Sources */,
|
||||
OBJ_39 /* SLazeKitTests.swift in Sources */,
|
||||
OBJ_40 /* StringInitializableTests.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
OBJ_43 /* Sources */ = {
|
||||
OBJ_48 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 0;
|
||||
files = (
|
||||
OBJ_44 /* Decodable.swift in Sources */,
|
||||
OBJ_45 /* NSManagedObject.swift in Sources */,
|
||||
OBJ_46 /* NSManagedObjectContext.swift in Sources */,
|
||||
OBJ_47 /* String.swift in Sources */,
|
||||
OBJ_48 /* EntityMapping.swift in Sources */,
|
||||
OBJ_49 /* StringInitializable.swift in Sources */,
|
||||
OBJ_50 /* SLazeKit.swift in Sources */,
|
||||
OBJ_49 /* Decodable.swift in Sources */,
|
||||
OBJ_50 /* NSManagedObject.swift in Sources */,
|
||||
OBJ_51 /* NSManagedObjectContext.swift in Sources */,
|
||||
OBJ_52 /* String.swift in Sources */,
|
||||
OBJ_53 /* EntityMapping.swift in Sources */,
|
||||
OBJ_54 /* StringInitializable.swift in Sources */,
|
||||
OBJ_55 /* SLazeKit.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
OBJ_38 /* PBXTargetDependency */ = {
|
||||
OBJ_43 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = "SLazeKit::SLazeKit" /* SLazeKit */;
|
||||
targetProxy = 625513641FDFD0C000CFF484 /* PBXContainerItemProxy */;
|
||||
targetProxy = 629A48071FDFE0D4002DAD03 /* PBXContainerItemProxy */;
|
||||
};
|
||||
OBJ_56 /* PBXTargetDependency */ = {
|
||||
OBJ_61 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = "SLazeKit::SLazeKitTests" /* SLazeKitTests */;
|
||||
targetProxy = 625513651FDFD0C000CFF484 /* PBXContainerItemProxy */;
|
||||
targetProxy = 629A48081FDFE0D4002DAD03 /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
OBJ_26 /* Debug */ = {
|
||||
OBJ_29 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
LD = /usr/bin/true;
|
||||
|
@ -297,15 +309,6 @@
|
|||
};
|
||||
name = Debug;
|
||||
};
|
||||
OBJ_27 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
LD = /usr/bin/true;
|
||||
OTHER_SWIFT_FLAGS = "-swift-version 4 -I /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/pm/4 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk";
|
||||
SWIFT_VERSION = 4.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
OBJ_3 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
|
@ -328,7 +331,16 @@
|
|||
};
|
||||
name = Debug;
|
||||
};
|
||||
OBJ_32 /* Debug */ = {
|
||||
OBJ_30 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
LD = /usr/bin/true;
|
||||
OTHER_SWIFT_FLAGS = "-swift-version 4 -I /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/pm/4 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk";
|
||||
SWIFT_VERSION = 4.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
OBJ_35 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
|
||||
|
@ -346,7 +358,7 @@
|
|||
};
|
||||
name = Debug;
|
||||
};
|
||||
OBJ_33 /* Release */ = {
|
||||
OBJ_36 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
|
||||
|
@ -384,7 +396,7 @@
|
|||
};
|
||||
name = Release;
|
||||
};
|
||||
OBJ_41 /* Debug */ = {
|
||||
OBJ_46 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ENABLE_TESTABILITY = YES;
|
||||
|
@ -406,7 +418,7 @@
|
|||
};
|
||||
name = Debug;
|
||||
};
|
||||
OBJ_42 /* Release */ = {
|
||||
OBJ_47 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ENABLE_TESTABILITY = YES;
|
||||
|
@ -428,13 +440,13 @@
|
|||
};
|
||||
name = Release;
|
||||
};
|
||||
OBJ_54 /* Debug */ = {
|
||||
OBJ_59 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
OBJ_55 /* Release */ = {
|
||||
OBJ_60 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
};
|
||||
|
@ -452,38 +464,38 @@
|
|||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Debug;
|
||||
};
|
||||
OBJ_25 /* Build configuration list for PBXNativeTarget "SLazeKitPackageDescription" */ = {
|
||||
OBJ_28 /* Build configuration list for PBXNativeTarget "SLazeKitPackageDescription" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
OBJ_26 /* Debug */,
|
||||
OBJ_27 /* Release */,
|
||||
OBJ_29 /* Debug */,
|
||||
OBJ_30 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Debug;
|
||||
};
|
||||
OBJ_31 /* Build configuration list for PBXNativeTarget "SLazeKitTests" */ = {
|
||||
OBJ_34 /* Build configuration list for PBXNativeTarget "SLazeKitTests" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
OBJ_32 /* Debug */,
|
||||
OBJ_33 /* Release */,
|
||||
OBJ_35 /* Debug */,
|
||||
OBJ_36 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Debug;
|
||||
};
|
||||
OBJ_40 /* Build configuration list for PBXNativeTarget "SLazeKit" */ = {
|
||||
OBJ_45 /* Build configuration list for PBXNativeTarget "SLazeKit" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
OBJ_41 /* Debug */,
|
||||
OBJ_42 /* Release */,
|
||||
OBJ_46 /* Debug */,
|
||||
OBJ_47 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Debug;
|
||||
};
|
||||
OBJ_53 /* Build configuration list for PBXAggregateTarget "SLazeKitPackageTests" */ = {
|
||||
OBJ_58 /* Build configuration list for PBXAggregateTarget "SLazeKitPackageTests" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
OBJ_54 /* Debug */,
|
||||
OBJ_55 /* Release */,
|
||||
OBJ_59 /* Debug */,
|
||||
OBJ_60 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Debug;
|
||||
|
|
|
@ -36,7 +36,7 @@ extension EntityMapping {
|
|||
}
|
||||
|
||||
extension Array where Element: EntityMapping {
|
||||
func serialized<T: NSManagedObject>(_ context: NSManagedObjectContext?) throws -> [T] {
|
||||
public func serialized<T: NSManagedObject>(_ context: NSManagedObjectContext?) throws -> [T] {
|
||||
return try flatMap({ try $0.serialized(context) })
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,138 @@
|
|||
import Foundation
|
||||
import SLazeKit
|
||||
import CoreData
|
||||
|
||||
//First we gonna create NSManagedObject object on which we will work.
|
||||
|
||||
/// We assume you have Model as an NSManagedObject
|
||||
class Model: NSManagedObject {}
|
||||
|
||||
// MARK: - Simulate extension for CoreData
|
||||
extension Model {
|
||||
@nonobjc public class func fetchRequest() -> NSFetchRequest<Model> {
|
||||
return NSFetchRequest<Model>(entityName: "Model")
|
||||
}
|
||||
|
||||
@NSManaged public var id: String
|
||||
@NSManaged public var value: Double
|
||||
@NSManaged public var name: String?
|
||||
}
|
||||
|
||||
|
||||
// MARK: - SLazeKit extension
|
||||
extension Model {
|
||||
/// Path pattern for our model API requests
|
||||
public struct PathPattern {
|
||||
static var model: String { return "/api/Models/:modelId" }
|
||||
static var models: String { return "/api/Models" }
|
||||
static var create: String { return "/api/Models/:modelId/create" }
|
||||
static var delete: String { return "/api/Models/:modelId/delete" }
|
||||
}
|
||||
/// We are creating struct which represents Decodable response of API request
|
||||
/// `EntityMappingDecodable` is required
|
||||
public struct ModelResponse: EntityMappingDecodable {
|
||||
var id: String
|
||||
var value: Double
|
||||
var name: String?
|
||||
/// We need provide NSManagedObject type for our serialization.
|
||||
public static var entityType: NSManagedObject.Type {
|
||||
return Model.self
|
||||
}
|
||||
/// By providing id attributes our model are updated/created/serialized
|
||||
public var idAttributes: [EntityAttribute]? {
|
||||
return [
|
||||
("id",id)
|
||||
]
|
||||
}
|
||||
|
||||
/// Fill CoreData object with our model response
|
||||
public func fillObject(with model: NSManagedObject) {
|
||||
guard let object = model as? Model else { return }
|
||||
object.id = id
|
||||
object.value = value
|
||||
object.name = name
|
||||
}
|
||||
}
|
||||
|
||||
/// We could skip that and add `Encodable` to our ModelResponse. But to highlight it. We will create separate one for request purpose
|
||||
public struct ModelRequest: Encodable {
|
||||
var id: String
|
||||
var value: Double
|
||||
var name: String?
|
||||
//Convenience initializer.
|
||||
init(with model: Model) {
|
||||
self.id = model.id
|
||||
self.value = model.value
|
||||
self.name = model.name
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension Model {
|
||||
/// Create request. Called from SLazeKit. Response is not maped or serialized.
|
||||
///
|
||||
/// - Parameters:
|
||||
/// - model: CoreData model used to post request with body of ModelRequest
|
||||
class func create(model: Model, success: @escaping (() ->()), failure: ((_ statusCode: Int, _ error: Error?) ->())? = nil) {
|
||||
/// SLazeKit request are done i background. To handle response on main thread we need to dispatch it.
|
||||
let _ = SLazeKit.post(path: PathPattern.create.patternToPath(with: ["modelId":model.id]), body: ModelRequest(with: model)) { (response, error) in
|
||||
guard error == nil else {
|
||||
DispatchQueue.main.async { failure?(response?.statusCode ?? -1,error) }
|
||||
return
|
||||
}
|
||||
DispatchQueue.main.async { success() }
|
||||
}
|
||||
}
|
||||
/// Another request example with out mapping or serialization.
|
||||
///
|
||||
/// - Parameters:
|
||||
/// - modelId: model id used to replace key string in path pattern.
|
||||
class func remove(for modelId: String, success: @escaping (() ->()), failure: ((_ statusCode: Int, _ error: Error?) ->())? = nil) {
|
||||
/// SLazeKit request are done i background. To handle response on main thread we need to dispatch it.
|
||||
let _ = SLazeKit.delete(path: PathPattern.delete.patternToPath(with: ["modelId":modelId])) { (response, error) in
|
||||
guard error == nil else {
|
||||
DispatchQueue.main.async { failure?(response?.statusCode ?? -1,error) }
|
||||
return
|
||||
}
|
||||
DispatchQueue.main.async { success() }
|
||||
}
|
||||
}
|
||||
/// `[ModelResponse]` Stands as a result type. Decodable provides generic requests. if Response model beside `Decodable` comforms to `EntityMapping` as well it will be serialized.
|
||||
class func getFromServer(success: @escaping (([Model]?) ->()), failure: (() ->())? = nil) {
|
||||
/// [ModelResponse] Decodable type used to generate result type.
|
||||
let _ = [ModelResponse].get(path: PathPattern.models.patternToPath()) { (response, result, error) in
|
||||
guard error == nil else {
|
||||
failure?()
|
||||
return
|
||||
}
|
||||
var models: [Model]? = nil
|
||||
do {
|
||||
//Result is type of `[ModelResponse]` to return array of our CoreData models we need to serialize it.
|
||||
//result?.serialized will return `[Model]`
|
||||
models = try result?.serialized(ModelResponse.persistentContainer?.newBackgroundContext())
|
||||
} catch {
|
||||
print(error)
|
||||
}
|
||||
success(models)
|
||||
}
|
||||
}
|
||||
|
||||
class func getFromServer(for modelId: String, success: @escaping ((Model?) ->()), failure: (() ->())? = nil) {
|
||||
/// in this example API request will decode single object of type ModelResponse instead of an array.
|
||||
let _ = ModelResponse.get(path: PathPattern.model.patternToPath(with: ["modelId":modelId])) { (response, result, error) in
|
||||
guard error == nil else {
|
||||
failure?()
|
||||
return
|
||||
}
|
||||
var models: Model? = nil
|
||||
do {
|
||||
//Result of type `ModelResponse` to return CoreData model we need to serialize it.
|
||||
//result?.serialized will return `Model`
|
||||
models = try result?.serialized(ModelResponse.persistentContainer?.newBackgroundContext())
|
||||
} catch {
|
||||
print(error)
|
||||
}
|
||||
success(models)
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue