Pale 0.1.1

Pale 0.1.1

José González 维护。



Pale 0.1.1

  • 作者:
  • José González

Pale

Version License Platform

Pale 是对 Moya 的一个小补充,以便能够使用可寻址供应商。

为什么Pale?

如果您使用开发环境来测试 iOS 应用,您可能会遇到根据需要动态地将应用程序指向其他环境的需要,这样您的 QA 部门就不需要您提供指向不同环境的不同应用程序。如果是这样,并且您正在使用 Moya 来实现您的网络层,这个小补充正是为您准备的。

Pale 引入了 AddressableMoyaProvider 的概念,它从 MoyaProvider 继承而来。一个 AddressableMoyaProvider 提供了一个可写的 baseURL 属性,您可以在运行时将其修改为指向不同的环境,因此使用您的供应商发出的请求将被路由到正确的环境。

好吧,但是我的意思是“Pale”这个名字的由来?

AddressableMoyaProvider 不能在没有适当的 baseURL 的情况下为您指明方向,就像 Pale Man 除非在手掌的眼睛的引导下,否则无法正确行动。

The Pale Man.

所以如果你使用 Pale

你将进入一个非常危险的地方,所以请小心。在那里沉睡的东西,它不是人类。

你已经被警告了。😜

使用 Pale

安装

Pale 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile

pod 'Pale'

使用可寻址提供者

从现在开始,我们假设你熟悉 Moya,至少是关于它的 基本用法。让我们使用一个可寻址提供者实现 Moya 示例中使用的服务的一个子集。

首先,我们创建一个通常的枚举,包含我们 API 的目标

enum MyService {
	case zen
	case showUser(id: Int)
}

然后,我们不是遵循 TargetType 协议,而是遵循我们新引入的 RelativeTargetType 协议。此协议基本上与 Moya 的 TargetType 协议相同,只是没有 baseURL 属性

extension MyService: RelativeTargetType {
    var path: String {
        switch self {
        case .zen:
            return "/zen"
        case .showUser(let id), .updateUser(let id, _, _):
            return "/users/\(id)"
        }
    }
    var method: Moya.Method {
        return .get
    }
    var task: Task {
        return .requestPlain
    }
    var sampleData: Data {
        switch self {
        case .zen:
            return "Half measures are as bad as nothing at all.".data(using: .utf8)!
        case .showUser(let id):
            return "{\"id\": \(id), \"first_name\": \"Harry\", \"last_name\": \"Potter\"}".data(using: .utf8)!
        }
    }
    var headers: [String: String]? {
        return ["Content-type": "application/json"]
    }
}

现在,不是创建一个 MoyaProvider,而是创建一个提供基本 URLAddressableMoyaProvider,我们将使用此提供者的所有请求目标

let provider = AddressableMoyaProvider<MyService>(baseURL: URL(string: "http://www.example.org")!)
provider.request(.zen) { result in
	// do something with the result
}

// Request will go to http://www.example.org/zen

provider.request(.showUser(id: 123))  { result in
	// do something with the result
}

// Request will go to http://www.example.org/users/123

如果你想动态更改要连接的服务器,只需更改 AddressableMoyaProviderbaseURL 属性即可

provider.baseURL = URL(string: "http://test-server.example.org")!
provider.request(.zen) { result in
	// do something with the result
}

// Request will go to http://test-server.example.org/zen

响应式扩展

Pale 还提供了响应式扩展,如果你喜欢使用 RxSwift Obseravble,在这种情况下,请确保在您的 Podfile 中包含以下内容

pod 'Pale/RxSwift'

然后,只需用 RelativeTarget 代替 Target 来调用响应式方法

provider.rx.request(.zen).subscribe(onNext: { response in
	// do something with the result
}, onError: { error in
	// do something with the error
})

开发Pale

Pale试图创建一个可复现的开发环境,以免我们遭受“在我的机器上编译”的困扰。为了实现这一点,本项目使用以下工具来确保每位开发者都能使用相同的设置(我们假设你在基于MacOS的机器上工作)。

  • Homebrew - 用于安装本设置中涉及的一些工具
  • rbenv - 用于设置构建工具使用的Ruby版本
  • Bundler - 用于指定构建项目使用的gem版本

除了这些用于启动环境的工具之外,我们还使用以下工具来管理项目的生命周期:

启动您的环境

为了正确构建和运行项目,您应按照以下步骤设置开发环境(如果您尚未为其他项目设置过)。

  • 请确保已安装Xcode,并使用以下命令安装命令行工具:

      $ xcode-select --install
    
  • 执行以下命令安装 Homebrew

      $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    
  • 安装和配置 rbenv

    • 执行以下命令安装 rbenv

        $ brew update
        $ brew install rbenv
        $ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
      
    • 重启终端,或在终端中运行 source ~/.bash_profile 以激活 rbenv

  • 使用以下命令安装 Ruby

      $ rbenv install 2.6.2
    
  • 克隆项目并将 cd 到您克隆项目的目录。 以下步骤必须在项目目录中运行,以保证gem适用于正确的Ruby版本

  • 安装 Bundler

      $ gem install bundler
    
  • 安装其他开发工具

      $ bundle install --path vendor/bundle --binstubs
    

就这样了!现在您有一个标准且可复现的开发环境,可以开始在没有血醉的情况下工作于Pale!

更新您的环境

每次我们在工具链中升级任何工具时,都应该重新运行上一个命令,从合适的步骤开始。

  • 如果我们更新了 Ruby 版本,从 Ruby 环境安装步骤开始。
  • 如果我们在项目的工具版本(例如,在 Gemfile 中更改)更新,只有重新运行开发工具的安装。

无论如何,《Bundler》都不会允许您继续执行命令,如果运行的《Ruby》版本与项目《Gemfile》中配置的版本不同。

安装依赖项

开始开发接下来的步骤是安装依赖项并生成Xcode工作空间。只需运行以下命令

$ bin/fastlane pods

请确保打开生成的《Example/Pale.xcworkspace》,而不是《Example/Pale.xcodeproj》中的项目。

作者

José González,[email protected]

许可证

《Pale》以MIT许可证提供。有关更多信息,请参阅LICENSE文件。