Lagoon 1.2.2

Lagoon 1.2.2

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布日期最后发布2019 年 9 月
SPM支持 SPM

incetro 维护。



Lagoon 1.2.2

  • 作者:
  • incetro

Placeholder

Build Status CocoaPods Carthage Compatible GitHub license Platforms

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 iOSLagoon macOS

  • 就这些了!

    Lagoon.framework 自动添加为目标依赖项,链接框架和嵌入框架,在复制文件构建阶段,这就是在模拟器和设备上构建所需的全部内容。

作者

incetro, [email protected]. 受 COOperation 启发

许可证

小龙湾可在MIT许可下使用。有关更多信息,请参阅LICENSE文件。