当前位置: 首页 > news >正文

企业网站方案推广神器

企业网站方案,推广神器,网站建设 艺麟盛世,电商网站开发工具【iOS Swift Moya 最新请求网络框架封装通用】 前言框架结构1.API定义(TargetType)2. 配置MoyaProvider3. 网络管理器4. 使用示例注意事项进一步优化 前言 设计一个基于Moya的网络请求框架,可以提供灵活的网络请求管理,例如设置请…

【iOS Swift Moya 最新请求网络框架封装通用】

  • 前言
    • 框架结构
    • 1.API定义(TargetType)
    • 2. 配置MoyaProvider
    • 3. 网络管理器
    • 4. 使用示例
    • 注意事项
    • 进一步优化

前言

设计一个基于Moya的网络请求框架,可以提供灵活的网络请求管理,例如设置请求超时时间、暂停某个正在进行的请求等功能。以下让我们一起来设计框架示例,包括关键部分的代码实现和详细说明。

框架结构

1. API定义(TargetType): 定义所有的API接口。
2. 网络提供者(MoyaProvider): 配置MoyaProvider,包括自定义Session以设置请求超时时间。
3. 网络管理器、网络响应处理 : 管理请求的发起、暂停和恢复;处理网络请求的响应和错误。
4. 使用实例。

1.API定义(TargetType)

  • 首先,定义一个符合TargetType协议的枚举来描述所有的API接口。例如,假设我们有一个用户相关的API:

    import Moyaenum UserAPI {case getUser(id: Int)case updateUser(id: Int, parameters: [String: Any])// 其他API接口
    }extension UserAPI: TargetType {var baseURL: URL {return URL(string: "https://api.example.com")!}var path: String {switch self {case .getUser(let id):return "/user/\(id)"case .updateUser(let id, _):return "/user/\(id)"}}var method: Moya.Method {switch self {case .getUser:return .getcase .updateUser:return .put}}var task: Task {switch self {case .getUser:return .requestPlaincase .updateUser(_, let parameters):return .requestParameters(parameters: parameters, encoding: JSONEncoding.default)}}var headers: [String : String]? {return ["Content-Type": "application/json"]}var sampleData: Data {// 提供模拟数据return Data()}
    }
    

2. 配置MoyaProvider

  • 为了设置请求超时时间,我们需要自定义Session并传递给MoyaProvider。同时,为了管理请求任务,我们需要保存Cancellable对象。

    import Moya
    import Alamofireclass NetworkProvider {static let shared = NetworkProvider()private let provider: MoyaProvider<UserAPI>private var cancellables: [String: Cancellable] = [:]private var pendingRequests: [String: (target: UserAPI, completion: (Result<Response, MoyaError>) -> Void)] = [:]private let lock = NSLock()private init() {let configuration = URLSessionConfiguration.defaultconfiguration.timeoutIntervalForRequest = 30 // 设置请求超时时间为30秒configuration.timeoutIntervalForResource = 60 // 设置资源请求超时时间为60秒let session = Alamofire.Session(configuration: configuration)provider = MoyaProvider<UserAPI>(session: session, plugins: [NetworkLoggerPlugin()])}/// 发起网络请求func request(_ target: UserAPI,identifier: String? = nil,completion:  (Result<Response, MoyaError>) -> Void) {let id = identifier ?? UUID().uuidStringpendingRequests[id] = (target, completion)let cancellable = provider.request(target) { [weak self] result inself?.lock.lock()self?.cancellables.removeValue(forKey: id)self?.pendingRequests.removeValue(forKey: id)self?.lock.unlock()completion(result)}lock.lock()cancellables[id] = cancellablelock.unlock()}/// 暂停指定的请求func pauseRequest(identifier: String) {lock.lock()if let cancellable = cancellables[identifier] {cancellable.cancel()cancellables.removeValue(forKey: identifier)// 请求已取消,保留在pendingRequests以便恢复}lock.unlock()}/// 暂停所有请求func pauseAllRequests() {lock.lock()for (id, cancellable) in cancellables {cancellable.cancel()// 请求已取消,保留在pendingRequests以便恢复}cancellables.removeAll()lock.unlock()}/// 重新发起指定的请求func resumeRequest(identifier: String) {lock.lock()guard let request = pendingRequests[identifier] else {lock.unlock()return}let cancellable = provider.request(request.target) { [weak self] result inself?.lock.lock()self?.cancellables.removeValue(forKey: identifier)self?.pendingRequests.removeValue(forKey: identifier)self?.lock.unlock()request.completion(result)}cancellables[identifier] = cancellablelock.unlock()}/// 重新发起所有请求func resumeAllRequests() {lock.lock()for (id, request) in pendingRequests {let cancellable = provider.request(request.target) { [weak self] result inself?.lock.lock()self?.cancellables.removeValue(forKey: id)self?.pendingRequests.removeValue(forKey: id)self?.lock.unlock()request.completion(result)}cancellables[id] = cancellable}lock.unlock()}
    }
    

    说明:

    • 自定义Session: 通过URLSessionConfiguration设置请求超时时间。
    • 管理Cancellable: 使用字典cancellables来保存每个请求的Cancellable对象,通过唯一标识符管理请求的取消。
    • 请求方法: request方法用于发起请求,并保存Cancellable对象。
    • 暂停请求: pauseRequest方法通过标识符取消指定的请求,pauseAllRequests取消所有请求。

3. 网络管理器

  • 创建一个更高层次的网络管理器,用于处理不同类型的API请求,提供更方便的接口给业务层使用。

    import Foundation
    import Moyaclass NetworkManager {static let shared = NetworkManager()private let networkProvider = NetworkProvider.sharedprivate init() {}/// 获取用户信息func getUser(id: Int, identifier: String? = nil, completion:  (Result<Response, MoyaError>) -> Void) {networkProvider.request(.getUser(id: id), identifier: identifier, completion: completion)}/// 更新用户信息func updateUser(id: Int, parameters: [String: Any], identifier: String? = nil, completion:  (Result<Response, MoyaError>) -> Void) {networkProvider.request(.updateUser(id: id, parameters: parameters), identifier: identifier, completion: completion)}/// 暂停指定请求func pauseRequest(identifier: String) {networkProvider.pauseRequest(identifier: identifier)}/// 暂停所有请求func pauseAllRequests() {networkProvider.pauseAllRequests()}/// 重新发起指定请求func resumeRequest(identifier: String) {networkProvider.resumeRequest(identifier: identifier)}/// 重新发起所有请求func resumeAllRequests() {networkProvider.resumeAllRequests()}// 其他API接口的封装
    }
    

    说明:

    • NetworkManager封装了所有的API接口调用,提供统一的入口。

    • 通过identifier参数,可以为每个请求指定唯一标识符,以便后续管理(暂停、取消等)。

    • 需要注意的是,HTTP请求本身并不支持暂停和恢复,只能取消并重新发起请求。如果实现类似暂停和恢复的功能,通常需要在请求被取消后,重新发起相同的请求。

4. 使用示例

  • 下面是如何使用上述框架进行网络请求、设置超时和暂停请求的示例。

    import UIKit
    import Moyaclass ViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad()// 发起获取用户信息的请求let requestIdentifier = "getUser_123"NetworkManager.shared.getUser(id: 123, identifier: requestIdentifier) { result inswitch result {case .success(let response):do {// 解析数据let json = try response.mapJSON()print("User Info: \(json)")} catch {print("解析错误: \(error)")}case .failure(let error):print("请求失败: \(error)")}}// 示例:在某个时刻暂停请求// NetworkManager.shared.pauseRequest(identifier: requestIdentifier)// 示例:在另一个时刻恢复请求// NetworkManager.shared.resumeRequest(identifier: requestIdentifier)}
    }
    

    说明:

    • 发起请求时,提供一个唯一的identifier用于后续管理。
    • 可以根据业务需求,在适当的时机调用pauseRequest或pauseAllRequests来取消请求。

注意事项

  1. 暂停和恢复请求: HTTP请求本身不支持暂停和恢复,pause操作实际上是取消请求,resume操作需要重新发起相同的请求。
  2. 线程安全: 使用NSLock确保对cancellables和pendingRequests的访问是线程安全的。
  3. 请求标识符: 为每个请求提供唯一的标识符,以便后续管理。可以使用UUID或自定义的字符串。
  4. 错误处理: 根据实际需求,完善错误处理和重试机制。
  5. 扩展性: 可以根据项目需求,进一步扩展网络框架,例如添加更多的插件、支持多种认证方式等。

进一步优化

  1. 支持多种API接口: 将UserAPI扩展为包含所有需要的API接口,或者使用多个TargetType枚举。
  2. 响应解析: 提供统一的响应解析方法,例如使用Codable解析JSON数据。
  3. 缓存机制: 根据需求添加网络缓存策略,提高性能。
  4. 重试机制: 对于失败的请求,添加自动重试机制。

通过以上设计和实现,您将拥有一个基于Moya的灵活且功能完整的网络请求框架,能够满足设置请求超时时间、暂停和恢复请求等需求。

需要讨论可加V:Jun_Yeong-Huang


文章转载自:
http://leaseback.gtqx.cn
http://hydrous.gtqx.cn
http://fellowless.gtqx.cn
http://uraniferous.gtqx.cn
http://scotchgard.gtqx.cn
http://reptant.gtqx.cn
http://pandoor.gtqx.cn
http://epicyclic.gtqx.cn
http://tannadar.gtqx.cn
http://lecithin.gtqx.cn
http://hin.gtqx.cn
http://wattless.gtqx.cn
http://transform.gtqx.cn
http://interstadial.gtqx.cn
http://memento.gtqx.cn
http://illuminometer.gtqx.cn
http://haematoma.gtqx.cn
http://radioamplifier.gtqx.cn
http://bough.gtqx.cn
http://fellagha.gtqx.cn
http://shunless.gtqx.cn
http://antiblack.gtqx.cn
http://fruition.gtqx.cn
http://phototheodolite.gtqx.cn
http://intrados.gtqx.cn
http://disyoke.gtqx.cn
http://spanner.gtqx.cn
http://proinsulin.gtqx.cn
http://statuette.gtqx.cn
http://snurfing.gtqx.cn
http://prolapse.gtqx.cn
http://supramaxilla.gtqx.cn
http://verselet.gtqx.cn
http://t.gtqx.cn
http://labyrinthian.gtqx.cn
http://attestator.gtqx.cn
http://orchidectomy.gtqx.cn
http://leukocyte.gtqx.cn
http://lomentum.gtqx.cn
http://castte.gtqx.cn
http://unenclosed.gtqx.cn
http://geophone.gtqx.cn
http://moving.gtqx.cn
http://postponement.gtqx.cn
http://kinswoman.gtqx.cn
http://isc.gtqx.cn
http://septet.gtqx.cn
http://rhyparographer.gtqx.cn
http://lowbrow.gtqx.cn
http://frosty.gtqx.cn
http://yellowwood.gtqx.cn
http://corynebacterium.gtqx.cn
http://cabinetmaking.gtqx.cn
http://phloxin.gtqx.cn
http://capias.gtqx.cn
http://hurrier.gtqx.cn
http://shadiness.gtqx.cn
http://seeker.gtqx.cn
http://roughride.gtqx.cn
http://granduncle.gtqx.cn
http://masculinity.gtqx.cn
http://vincible.gtqx.cn
http://locky.gtqx.cn
http://irani.gtqx.cn
http://ergotamine.gtqx.cn
http://largando.gtqx.cn
http://fantasise.gtqx.cn
http://apraxia.gtqx.cn
http://moto.gtqx.cn
http://dextrous.gtqx.cn
http://knitwork.gtqx.cn
http://olivaceous.gtqx.cn
http://gazogene.gtqx.cn
http://goer.gtqx.cn
http://sinify.gtqx.cn
http://tsi.gtqx.cn
http://pyriform.gtqx.cn
http://mycetozoan.gtqx.cn
http://disinhume.gtqx.cn
http://vatican.gtqx.cn
http://malinowskian.gtqx.cn
http://kef.gtqx.cn
http://compartmentation.gtqx.cn
http://sunshade.gtqx.cn
http://reallocate.gtqx.cn
http://gamosepalous.gtqx.cn
http://downplay.gtqx.cn
http://faulty.gtqx.cn
http://lending.gtqx.cn
http://gainless.gtqx.cn
http://londonization.gtqx.cn
http://curtailment.gtqx.cn
http://trimetallic.gtqx.cn
http://quayage.gtqx.cn
http://immanence.gtqx.cn
http://italianise.gtqx.cn
http://undersleep.gtqx.cn
http://anuria.gtqx.cn
http://hypnosis.gtqx.cn
http://oversteering.gtqx.cn
http://www.15wanjia.com/news/60374.html

相关文章:

  • html5商城网站源码八八网
  • 百度外包公司有哪些湖南seo优化服务
  • 拍摄制作宣传片企业新乡seo优化
  • 上海中学官网登录seo站外推广有哪些
  • 网站中如何做图片轮播网站定制开发
  • vue.js合作做网站么国际重大新闻事件2023
  • 网页制作 公司网站优化网站价格
  • 做网站用虚拟服务器可以吗百度旗下所有app列表
  • 专业做轮胎的网站免费宣传网站
  • 在网站建设中 为了防止工期拖延短信营销平台
  • 公司用wordpress建站用花钱百度推广方案
  • 钓鱼网站二维码制作软件软件开发交易平台
  • 微网站备案免费域名注册
  • 旅游网站建设规模深圳网站开发
  • 商务网站建设的一般流程是什么百度推广平台登录网址
  • 新密做网站推广石家庄百度推广排名优化
  • 网站制作的公司东莞做网站推广
  • 国外logo设计网站推荐谷歌广告优化
  • 仙桃做网站的公司百度怎么推广自己的店铺
  • 网站制作合同网站seo李守洪排名大师
  • 专做排名的网站做优化关键词
  • 企业网站建设 制作网站模板免费
  • 企业网站建设 哪个公司做得好广州seo做得比较好的公司
  • 网站优化和推广方案ppt营销网站策划方案
  • 用源码做自己的网站aso优化
  • 网站套模板教程可以免费推广的网站
  • 游戏交易网站怎么做企业seo网络营销
  • 网站备案要几天贴吧高级搜索
  • 做网站一个人能做吗谷歌网站收录提交入口
  • 北京网站建设公司电话seo中文含义是什么