Lagoon 是一个使用 Swift 编写的框架,可以帮助您轻松组织服务层
特性
- 异步操作
- 开箱即用的 SOLID
- 非常简单的单元测试编写
- 可重用的业务逻辑
- 泛型
用法
查看简单示例
这里我们将字符串转换为数字,增加和减少它,乘以和除以数字。让我们创建示例操作
/// Convert String to Int
class ConvertOperation: ChainableOperationBase<String, Int> {
override func process(inputData: String, success: (Int) -> (), failure: (Error) -> ()) {
if let result = Int(inputData) {
success(result)
} else {
failure(NSError(domain: "com.incetro.Lagoon.Example", code: 1, userInfo: nil))
}
}
}
/// Increment the given number
class IncrementOperation: ChainableOperationBase<Int, Int> {
override func process(inputData: Int, success: (Int) -> (), failure: (Error) -> ()) {
success(inputData + 1)
}
}
/// Decrement the given number
class DecrementOperation: ChainableOperationBase<Int, Int> {
override func process(inputData: Int, success: (Int) -> (), failure: (Error) -> ()) {
success(inputData - 1)
}
}
/// Multiply the given number
class MultiplicationOperation: ChainableOperationBase<Int, Int> {
let mult: Int
init(with mult: Int) {
self.mult = mult
}
override func process(inputData: Int, success: (Int) -> (), failure: (Error) -> ()) {
success(inputData * self.mult)
}
}
/// Make array of digits from the given number
class ArrayOperation: ChainableOperationBase<Int, [Int]> {
override func process(inputData: Int, success: ([Int]) -> (), failure: (Error) -> ()) {
var result: [Int] = []
var number = inputData
while number > 0 {
result.append(number % 10)
number = number / 10
}
success(result.reversed())
}
}
并将链形成 convert -> increment -> decrement -> multiplication -> array
let strings = ["123", "4", "56a", "a", ""]
for string in strings {
let convert = ConvertOperation()
let increment = IncrementOperation()
let decrement = DecrementOperation()
let mult = MultiplicationOperation(with: 125)
let array = ArrayOperation()
/// Create chain
let operations = [convert, increment, decrement, mult, array]
/// We expect Int array as output type
let compoundOperation = CompoundOperation.default(withOutputDataType: [Int].self)
/// Setup compound operation
compoundOperation.configure(withChainableOperations: operations, inputData: string, success: { result in
print(result)
}, failure: { error in
print(error.localizedDescription)
})
/// Start it!
Lagoon.add(operation: compoundOperation)
}
高级用法
好的,如何在实际项目中使用它?看看这个。
// MARK: - RequestDataSigningOperation
class RequestDataSigningOperation: ChainableOperationBase<RequestDataModel, RequestDataModel> {
private let requestSigner: RequestDataSigner
init(withRequestSigner requestSigner: RequestDataSigner) {
self.requestSigner = requestSigner
}
override func process(inputData: RequestDataModel, success: (RequestDataModel) -> (), failure: (Error) -> ()) {
let signedRequestDataModel = requestSigner.signRequestDataModel(inputData)
success(signedRequestDataModel)
}
}
// MARK: - RequestConfigurationOperation
class RequestConfigurationOperation: ChainableOperationBase<RequestDataModel, URLRequest> {
private let requestConfigurator: RequestConfigurator
private let method: HTTPMethod
private let serviceName: String?
private let urlParameters: [String]
private let queryType: QueryType
init(configurator: RequestConfigurator, method: HTTPMethod, type: QueryType, serviceName: String?, urlParameters: [String]) {
self.method = method
self.queryType = type
self.serviceName = serviceName
self.urlParameters = urlParameters
self.requestConfigurator = configurator
}
// MARK: - ChainableOperationBase
override func process(inputData: RequestDataModel, success: (URLRequest) -> (), failure: (Error) -> ()) {
let request = requestConfigurator.createRequest(withMethod: self.method,
type: self.queryType,
serviceName: self.serviceName,
urlParameters: self.urlParameters,
requestDataModel: inputData)
success(request)
}
}
/// And other operations...
/// Then use it to make network chain
let operations = [
requestDataSigningOperation,
requestConfigurationOperation,
networkRequestOperation,
deserializationOperation,
validationOperation,
responseCachingOperation,
responseMappingOperation
]
let compoundOperation = CompoundOperation.default(withOutputDataType: User.self)
compoundOperation.maxConcurrentOperationCount = 1
compoundOperation.configure(withChainableOperations: operations, inputData: inputData, success: success, failure: failure)
Lagoon.add(operation: compoundOperation)
需求
- iOS 8.0+ / macOS 10.9+
- Xcode 8.1, 8.2, 8.3, 和 9.0
- Swift 3.0, 3.1, 3.2, 和 4.0
交流
- 如果你发现了bug,请提交一个issue。
- 如果你有功能请求,请提交一个issue。
- 如果你希望贡献力量,提交一个pull request。
安装
CocoaPods
CocoaPods是Cocoa项目的依赖管理工具。你可以使用以下命令安装它
$ gem install cocoapods
要使用CocoaPods将Lagoon集成到你的Xcode项目中,在Podfile
中指定它
use_frameworks!
target "<Your Target Name>" do
pod "Lagoon"
end
然后,运行以下命令
$ pod install
手动
如果你不希望使用任何依赖管理工具,你可以手动将Lagoon集成到你的项目中。
嵌入式框架
-
打开终端,使用
cd
命令进入你的顶级项目目录,然后运行以下命令“if”你的项目未作为git仓库初始化$ git init
-
将小龙湾添加为git 子模块,运行以下命令:
$ git submodule add https://github.com/incetro/Lagoon.git
-
打开新的
小龙湾
文件夹,并将Lagoon.xcodeproj
拖动到您的应用程序Xcode项目的项目导航器中。它应该嵌套在您应用程序的蓝色项目图标下面。它是否在所有其他Xcode组之上或之下并不重要。
-
在项目导航器中选择
Lagoon.xcodeproj
,并验证部署目标是否与您的应用程序目标匹配。 -
接下来,在项目导航器中选择您的应用程序项目(蓝色项目图标),以便导航到目标配置窗口,并在侧边栏的“目标”标题下选择应用程序目标。
-
在窗口顶部的标签栏中,打开“通用”面板。
-
在“已嵌入的二进制文件”部分下点击
+
按钮。 -
您将看到两个不同的
Lagoon.xcodeproj
文件夹,每个文件夹中都嵌套着两个不同版本的Lagoon.framework
,这些框架都在一个Products
文件夹中。您可以选择哪个
Products
文件夹并不重要,但选择顶部或底部的Lagoon.framework
是重要的。 -
对于iOS,选择顶部的
Lagoon.framework
,对于OS X,选择底部的。您可以通过检查项目的构建日志来验证您选择了哪一个。构建目标为
Lagoon
会显示为Lagoon iOS
或Lagoon macOS
。 -
就这些了!
将
Lagoon.framework
自动添加为目标依赖项,链接框架和嵌入框架,在复制文件构建阶段,这就是在模拟器和设备上构建所需的全部内容。
作者
incetro, [email protected]. 受 COOperation 启发
许可证
小龙湾可在MIT许可下使用。有关更多信息,请参阅LICENSE文件。