swift 3(xCode8-beta6)上的可达性问题

Posted

技术标签:

【中文标题】swift 3(xCode8-beta6)上的可达性问题【英文标题】:Reachability issue on swift 3(xCode8-beta6) 【发布时间】:2016-08-24 18:02:18 【问题描述】:

我目前正在使用 xCode8 beta6(swift3) 中的可达性库开发一个项目。 我想我在我的项目中正确地实现了 Reachability.swift。

顺便说一句,当我调用reachability.startNotifier() 时,应用程序在Reachability.swift 的以下行中崩溃。

let reachability = Reachability()!
NSNotificationCenter.defaultCenter().addObserver(self, selector: "reachabilityChanged:",name: ReachabilityChangedNotification,object: reachability)
    do
      try reachability.startNotifier()
    catch
      print("could not start reachability notifier")
    

这是我在日志中看到的内容。

*** NSForwarding:警告:“WebClient”类的对象 0x10d939668 未实现 methodSignatureForSelector: -- 前面的麻烦无法识别的选择器 +[WebClient 可达性改变:]

当然,我确实实现了reachabilityChanged选择器功能。

func reachabilityChanged(note: NSNotification) 

        let reachability = note.object as! Reachability

        if reachability.isReachable 
            if self.pendingSurvey == true 
               ....
            
        
    

我花了很多时间寻找原因,但我无法弄清楚。

【问题讨论】:

【参考方案1】:

在 Swift 3 中,func reachabilityChanged(note: NSNotification) 的 Objective-C 选择器变为 reachabilityChangedWithNote:。 (这在某些测试版中可能会有所不同。)因此,Reachability 运行时找不到选择器reachabilityChange: 的方法并崩溃。

通常你在 Swift 3 中为选择器 reachabilityChange: 声明一个 Swift 方法为:

func reachabilityChanged(_ note: NSNotification) 
    //

或者使用@objc是另一种方式:

@objc(reachabilityChange:)
func reachabilityChanged(note: NSNotification) 
    //

【讨论】:

我尝试更新代码,但还是不行。 它像往常一样导致崩溃。 看来Reachability 还是找不到reachabilityChanged: 方法。 @star99,您可能在迁移时损坏了其他部分,或者 Reachability 可能与 Swift 3 存在一些未知的不兼容问题。无论如何,如果没有您提供更多上下文,我不能再说什么了。

以上是关于swift 3(xCode8-beta6)上的可达性问题的主要内容,如果未能解决你的问题,请参考以下文章

迁移到 Swift 3 时可以使用旧框架吗?

java中关于对象的可达可用问题

Swift 4 中的可达性问题

Swift 3 通过可达性检查互联网连接

iOS - Swift - UIImage 上的可点击区域

SwiftUI - 从 Swift 类启动的可观察对象不会更新 ContentView() 上的 @ObservedObject