LiteNetwork 1.0.1

LiteNetwork 1.0.1

Swifter 维护。



  • 作者:
  • 刘洋

LiteNetwork

LiteNetwork 是一个基于 Swift 编写的轻量级且功能强大的网络请求框架。

概述

LiteNetwork 是一个基于 Apple 内置的 URLSession API 的轻量级网络请求框架。它使用链式 sourceBag 管理系统来确保多个任务的有序执行,这意味着您可以使用方法链来调用多个请求,并且请求将以调用的顺序发送。您可轻松快速地更改配置信息,创建和更新任务,并通过框架接口进行统一管理,而不必关心底层方法。该框架支持创建和配置五个任务:数据、下载、上传文件、上传数据和上传流。并提供了一系列自定义接口。

特性

  • 便于处理 URLSessionConfiguration 及其更新
  • 支持数据、下载、上传和流任务的自定义处理
  • 避免不便利的嵌套回调
  • 多任务异步操作
  • 统一任务管理
  • 自动无效化会话

要求

  • iOS 13.0+ / macOS 10.12+
  • Swift 5.2+

安装

Swift包

通过以下步骤将开源包导入到您的项目中

  1. Xcode -> 文件 -> Swift包 -> 添加包依赖
  2. 搜索 https://github.com/lmyl/LiteNetwork 并将其添加到您的目标中

使用方法

处理流任务

  1. 使用 makeStreamWith() 方法初始化配置信息并创建流任务
// the default initialize create Default type of session
let token = LiteNetworkStream().makeStreamWith(host: "local", port: 9898)
  1. 在此处进行一些自定义更改
let token = LiteNetworkStream().makeStreamWith(host: "local", port: 9898)
            .setEphemeralConfigureType() // Change Default to Ephemeral
            .updateStreamReadCloseComplete {
                print("Read closed")
        }
  1. 调用 startConnect()startSecureConnect() 来恢复任务
let token = LiteNetworkStream().makeStreamWith(host: "local", port: 9898)
            .setEphemeralConfigureType()
            .updateStreamReadCloseComplete {
                print("Read closed")
        }
        .startConnect()
  1. 连接到服务器并处理您的操作。 当有多个任务时,它们将异步和顺序执行。
let input = "hello world!"
token.readData(minLength: 1, maxLength: 1000, timeout: 30) { dataOrNil, eof, errorOrNil in
            if let error = errorOrNil {
                print("Error: " + error.localizedDescription)
            }
            if let data = dataOrNil {
                print(String.init(data: data, encoding: .utf8)!)
            }
            print("EOF: \(eof)")
            // return Bool to indicate whether current session will be invalidated
            return false
        }
        
// You can create multiple tasks in a row, just like this:
token.writeData(input: input.data(using: .utf8)!, timeout: 30, completionHandler: {
            errorOrNil in
            if let error = errorOrNil {
                print("Error: " + error.localizedDescription)
            } else {
                print("Complete")
            }
            return false
        })
token.simpleCommunicateWithSever(input: input.data(using: .utf8)!) { dataOrNil, errorOrNil in
            if let data = dataOrNil {
                print(String.init(data: data, encoding: .utf8)!)
            }
            if let error = errorOrNil {
                print("Error: " + error.localizedDescription)
            }
            return false
        }
        
  1. 注意以下情况
  • 您手动关闭读/写流
  • 一个操作(writeData()readData()simpleCommunicateWithSever())发生 错误
  • 一个操作(writeData()readData()simpleCommunicateWithSever())在完成处理程序中返回 true

则会话将调用 invalidateAndCancel() 并自动使其无效,其余操作不会执行。

// manual operations:
token.closeWriteStream()
token.closeReadStream()
// or 
token.cancelSessionFinishCurrentTask()
// or 
token.cancelSessionRightWay()

处理上传/下载任务

基本步骤与上述步骤相似。请注意,您需要调用 fire() 来恢复所有任务,而不是 startConnect()

  1. 初始化并创建您的任务
let token2 = LiteNetwork().makeDataRequest(for: {
            URLRequest(url: URL(string: "https://www.baidu.com")!)
            })
  1. 进行一些自定义更改
let token2 = LiteNetwork().makeDataRequest(for: {
            URLRequest(url: URL(string: "https://www.baidu.com")!)
            })
            .setRequestCachePolicy(for: .reloadIgnoringCacheData)
  1. 处理从服务器接收到的数据(或其他类型的数据)
.processData(for: {
                response, dataOrNil in
                if let data = dataOrNil, let string = String(data: data, encoding: .utf8) {
                    print(string)
                }
            })
  1. 使用 fire() 恢复所有任务。您可以连续创建多个任务,如下面的代码所示
let token2 = LiteNetwork()
            // first task
            .makeDataRequest(for: {
            URLRequest(url: URL(string: "https://www.baidu.com")!)
            }).setRequestCachePolicy(for: .reloadIgnoringCacheData).processData(for: {
                response, dataOrNil in
                if let data = dataOrNil, let string = String(data: data, encoding: .utf8) {
                    print(string)
                }
            })
            // second task
            .makeDataRequest(for: {
            return URLRequest(url: URL(string: "https://www.apple.com/cn/")!)
            }).processData(for: {
                response, dataOrNil in
                if let data = dataOrNil, let string = String(data: data, encoding: .utf8) {
                    print(string)
                }
            }).processGlobeFailure(for: {
                print("Error:" + $0.localizedDescription)
            })
            // resume all
            .fire()
  1. 您可以使用下面提供的方法在不同时间无效化您的会话 (随时无效化)。如果您没有手动调用无效化方法,框架默认在所有任务完成后无效化会话。
token2.cancelSessionFinishCurrentTask()
// or
token2.cancelSessionRightWay()

有关更多用法,请阅读 LiteNetwork.swiftLiteNetworkStream.swift

联系

GitHub issue 跟踪器: issue tracker(在此处报告错误)

Google 邮箱: [email protected][email protected](如果您有任何疑问或建议,请联系我们)