gpt4 book ai didi

ios - 处理整个应用程序的互联网连接

转载 作者:行者123 更新时间:2023-11-29 11:24:52 25 4
gpt4 key购买 nike

我的应用有大约 30 个屏幕。假设用户在屏幕上并且互联网断开连接,我想显示一个没有互联网连接的 View 。

一种方法是在每个 VC 中添加一个 UIView 并使用重试按钮显示它,用户可以再次点击该按钮。但是这一步需要在所有屏幕上添加 UIView,我不想这样做。

是否有通用的方法来实现这一点?就像创建一个 UIViewController 并在互联网可用时显示它一样。但即便如此,在关闭 View Controller 时,我怎么知道用户在哪个屏幕上以及要再次调用哪些 API。

NOTE: I am trying for a solution where I do not need to add code in every VC and handle it from one class.

是不是很困惑?请在评论中告诉我,我会尝试重新措辞并使其更加清晰。

最佳答案

在深入研究下面的解决方案之前,我想指出通过使用响应者链 进行的错误处理。 John Sundell 写了一篇关于如何使用响应链实现错误处理的优秀文章。 Propagating user-facing errors in Swift

一个可能的解决方案是让 View Controller 实现一个协议(protocol),例如 NoConnectionPresentable,并在网络客户端上有一个属性接受符合 NoConnectionPresentable 的对象。

NoConnectionPresentable - 协议(protocol)具有 showNoConnectionAlert 功能以显示警报。它还具有 showNoConnectionAlert 函数的默认实现,因此无需在每个 View Controller 上实现它。其次,它有一个属性 retry,这是一个在需要重试时执行的闭包。此 retry 闭包特定于 View Controller ,需要在每个 View Controller 中实现。

NoConnectionPresentable 示例:

protocol NoConnectionPresentable: class {
var retryCallback: (() -> Void)? { get }
func showNoConnectionAlert()
}

extension NoConnectionPresentable where Self: UIViewController {
func showNoConnectionAlert() {
let alert = UIAlertController(title: "no connection",
message: "it appears you dont have a connection",
preferredStyle: .alert)
alert.addAction(
UIAlertAction(title: "okay", style: UIAlertAction.Style.cancel, handler: nil))
alert.addAction(
UIAlertAction(title: "retry", style: UIAlertAction.Style.default) { _ in
self.retryCallback?()
})
present(alert, animated: true, completion: nil)
}
}

每当网络客户端需要执行一些网络操作时,它首先检查连接。例如,如果没有连接,请调用 no-connection-presentable 对象以显示警报。

网络客户端示例:

class NetworkService {
weak var noConnectionPresenter: NoConnectionPresentable?

func get() {
// check connections, no connection?
noConnectionPresenter?.showNoConnectionAlert()
}
}

示例 View Controller :

class NewsViewController: UIViewController, NoConnectionPresentable {
lazy var retryCallback: (() -> Void)? = {
self.load()
}

unowned let networkService: NetworkService
init(networkService: NetworkService) {
self.networkService = networkService
super.init(nibName: nil, bundle: nil)
networkService.noConnectionPresenter = self
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func loadView() {
let view = UIView()
view.backgroundColor = .white
self.view = view
}

override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.load()
}
}

private func load() {
print("loading")
networkService.get()
}
}

这个实现假设每个 View Controller 都用它自己的网络客户端实例化。如果网络客户端定义一次,并在所有 View Controller 中使用,请确保将当前 View Controller 重新分配给 noConnectionPresenter - 网络客户端外观的属性(viewWillAppear) 例如。所以可见的 View Controller 将显示警报。

关于ios - 处理整个应用程序的互联网连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59444081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com