WhiteFlowerFactory 0.4.2

WhiteFlowerFactory 0.4.2

Stephen Bodnar 维护。



  • 作者:
  • Stephen Bodnar

Unit tests

WhiteFlowerFactory 是一个简单的 URLSession 包装器,支持同时和串行请求队列。

Cocoapods 安装

pod 'WhiteFlowerFactory'

Carthage 安装(推荐)

将以下内容添加到 cartfile

github "JoeyBodnar/WhiteFlowerFactory" == 0.4.0

使用方法

目前,所有回调都在主队列中完成,但这种情况可能会在未来发生变化。

GET 请求

要进行简单的 GET 请求

WhiteFlower.shared.get(urlString: "") { response in
    switch response.result {
    case .success(let data): // do something with data
    case .failure(let error): // do something with network error
    }
}

使用 Codable 序列化响应

如果您有一个类型,希望使用 Codable 序列化响应

WhiteFlower.shared.get(urlString: "") { response in
    switch response.serializeTo(type: MyClass.self) {
        case .success(let myClassInstance): // do something with myClassInstance
        case .failure(let error): // do something with network error  
    }
}

验证是否正常

有时你只是想确认一个对象已被创建,并期望得到一个空体的响应。为此,请使用isOK()

WhiteFlower.shared.post(urlString: "https://#/postSomething", params: ["key": "value"], headers: nil, completion: { (response) in
    switch response.isOk() {
    case .success: // success
    case .failure(let error)
    }
}

POST 请求

一个示例 POST 请求

WhiteFlower.shared.post(urlString: "urlHere", params: ["testParam" : "param1"], headers: [HTTPHeader(field: HTTPHeaderField.authentication.rawValue, value: "Bearer xxxx")]) { (response) in
        
}

提供商 - 类型安全的路由

要使用 WhiteFlowerFactory 提供类型安全的路由,建议你创建一个符合 Provider 协议的枚举。理想情况下,你将为应用程序中每个 baseURL 端点创建一个符合 Provider 协议的枚举。例如,假设你的应用程序需要连接到 Stripe API 和 Facebook API。你可以创建一个符合 Provider 协议的枚举,如下所示:

enum Facebook: Provider {
    case login
    case getFriends
    
    var path: String {
        switch self {
        case .login: return "\(baseURL)/login"
        case .getFriends: return "\(baseURL)/me/friends"
        }
    }

    var baseURL: String { return "https://facebook.com" }

    static var name: String { return String(describing: Facebook.self) // this returns "Facebook" }
}

Stripe 的也可以同样处理

enum Stripe: Provider {
    case chargeCard
    
    var path: String {
        switch self {
        case .chargeCard: return "\(baseURL)/charge"         
        }
    }

    var baseURL: String { return "https://api.stripe.com" }

    static var name: String { return String(describing: Stripe.self)  }
}

现在,你可以利用类型安全的路由了

WhiteFlower.shared.post(endPoint: Stripe.chargeCard, params: ["":""], headers: []) { (response) in
        
}

串行网络操作

要串行(一个接一个,在前一个请求完成后启动下一个请求)发起请求数据,只需创建一个 WhiteFlowerRequest 对象数组,并创建一个 WhiteFlowerSerialQueue

  let requests = [WhiteFlowerRequest(method: .get, urlString: "https://facebook.com"), WhiteFlowerRequest(method: .get, urlString: "https://google.com"), WhiteFlowerRequest(method: .get, urlString: "https://reddit.com/r/iosprogramming")]
  
  let queue = WhiteFlowerSerialQueue(operationQueue: OperationQueue())
  
  queue.start(requests: requests, operationCompletion: { (response) in
      // this completion is called after every indiviudal request is finished
      // so in this examlple, it will be called 3 times
  }) { (allResponses) in
      // this is called at the very end and gives an array of APIResponse objects
  }

并发网络操作

若要并发发起多个请求,且只在一个所有请求完成后接收回调,请使用 WhiteFlowerConcurrentQueue

let requests = [WhiteFlowerRequest(method: .get, urlString: "https://facebook.com"), WhiteFlowerRequest(method: .get, urlString: "https://google.com"), WhiteFlowerRequest(method: .get, urlString: "https://reddit.com/r/iosprogramming")]

let queue = WhiteFlowerConcurrentQueue(requests: [], queue: DispatchQueue.main)
queue.execute { responses in
    // `responses` is an array of APIResponse objects
}

《responses》数组将按照响应原本执行的顺序返回响应。因此,在上面的示例中,对《https://facebook.com》的请求的响应对象将是第一个,google将是第二个,而reddit.com/r/iosprogramming将是最后一个。