刷新时的可达性问题

Posted

技术标签:

【中文标题】刷新时的可达性问题【英文标题】:Reachability issue while refreshing 【发布时间】:2018-02-15 11:01:40 【问题描述】:

首先是我的代码

 func checkInternetConnection() 

    reachability.whenReachable =  _ in
            self.loadPost()
            self.checkNewMessages()
            self.slowView.frame.size.height = 0
            self.slowView.isHidden = true
            self.internetStatus.text = ""
            self.slowView.layer.zPosition = 0
    
    reachability.whenUnreachable =  _ in
        self.refreshControl.endRefreshing()
        self.slowView.backgroundColor = #colorLiteral(red: 1, green: 0.1491314173, blue: 0, alpha: 1)
        self.slowView.layer.zPosition = 1
        self.slowView.frame.size.height = 40
        self.slowView.isHidden = false
        self.internetStatus.text = "Keine Internetverbindung!"
        self.activityIndicatorView.stopAnimating()
        self.Indicator.stopAnimating()

    
    NotificationCenter.default.addObserver(self, selector: #selector(self.internetChanged(note:)), name: Notification.Name.reachabilityChanged, object: self.reachability)
    do 
        try self.reachability.startNotifier()
    catch 
        print("error")
    



@objc func internetChanged(note: Notification) 
    let reachability = note.object as! Reachability
    if reachability.connection != .none 
            self.slowView.backgroundColor = #colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1)
            self.slowView.layer.zPosition = 1
            self.slowView.frame.size.height = 40
            self.slowView.isHidden = false
            self.internetStatus.text = "Mit dem Internet verbunden!"
            DispatchQueue.main.asyncAfter(deadline: .now() + 3 , execute: 
                self.slowView.layer.zPosition = 0
                self.slowView.frame.size.height = 0
            )

     else 
        print("kein internet")
    


我在 viewDidLoad() 中调用了 checkInternetConnection() 方法,它工作正常,但是一旦我刷新我的 tableview,它就不会进入可达性闭包。

在 handleRefresh() 中(仅用于重新加载帖子即可正常工作)调用 checkInternetConnection() 方法但不会触发任何代码,该问题仅在刷新时出现,而不是在初始加载时出现。

我将此视频用作参考: https://www.youtube.com/watch?v=wDZmz9IsB-8 有什么建议吗?

【问题讨论】:

【参考方案1】:

我认为(但不是 100% 确定)闭包 whenReachablewhenUnreachable 仅在发生适当的可达性更改时才被调用;此外,它们可能会在分配时被自动调用。因此,无论您多久调用一次checkInternetConnection,除非设备离线/在线,否则关闭不会重新执行。

为了解决这个问题,我建议改用可达性标志:

if reachability.isReachable 
  // update view for reachable state

else 
  // update view for unreachable state

【讨论】:

首先谢谢,现在效果更好了。我现在的问题是,当我再次连接到互联网并刷新时,我的应用程序崩溃(索引超出范围)。当我等待 5 秒直到我刷新时,这不会发生吗?我可以通过延迟加载来解决这个问题,但我想这会做得不好,而且不是最好的解决方案,有什么想法可以解决这个问题吗? 好吧,找出无效访问发生的位置...这是一个单独的问题,与您的原始问题无关,因此您应该尝试将其分开并 - 如果需要 - 创建一个新问题问题。

以上是关于刷新时的可达性问题的主要内容,如果未能解决你的问题,请参考以下文章

应用程序处于后台时的 iOS 可达性

如何在 iOS 中测试可达性并重试连接?

JVM垃圾收集之可达性分析

JAVA中GC时finalize()方法是不是一定会被执行?

可达性与 UIDevice-可达性

JVM并发的可达性分析