【问题标题】:How do I use this code in a singleton in swift?如何快速在单例中使用此代码?
【发布时间】:2016-11-15 17:27:48
【问题描述】:

我有我在这里找到的这段代码。现在我想知道如何在单例中使用它。我的理解是,如果我在单例中使用此代码,我会注意到网络状态是否发生变化。

 func startNetworkReachabilityObserver() {
    let reachabilityManager = Alamofire.NetworkReachabilityManager(host: "www.google.com")
    reachabilityManager?.listener = { status in

        switch status {

        case .NotReachable:
            print("The network is not reachable")

        case .Unknown :
            print("It is unknown whether the network is reachable")

        case .Reachable(.EthernetOrWiFi):
            print("The network is reachable over the WiFi connection")

        case .Reachable(.WWAN):
            print("The network is reachable over the WWAN connection")

        }
    }

    // start listening
    reachabilityManager?.startListening()
}

【问题讨论】:

  • 您可以简单地将其设为类方法并按原样使用它。我猜不需要使用单例。只要应用程序启动就调用这个函数。
  • 在单例中使用它与在其他类中使用它没有区别,单例中没有魔法意味着它必须进入单例,只要该类的生命周期与您一样长,任何类都可以需要更改通知。
  • 如果我创建一个类方法,我不会收到任何网络状态更改的通知。我会单身。

标签: ios singleton swift3 alamofire


【解决方案1】:

只要您保留对reachabilityManager 的引用,使用单例就可以工作

class NetworkStatus {
static let sharedInstance = NetworkStatus()

private init() {}

let reachabilityManager = Alamofire.NetworkReachabilityManager(host: "www.apple.com")

func startNetworkReachabilityObserver() {
    reachabilityManager?.listener = { status in

        switch status {

        case .notReachable:
            print("The network is not reachable")

        case .unknown :
            print("It is unknown whether the network is reachable")

        case .reachable(.ethernetOrWiFi):
            print("The network is reachable over the WiFi connection")

        case .reachable(.wwan):
            print("The network is reachable over the WWAN connection")

        }
    }
    reachabilityManager?.startListening()
}

}

所以你可以这样使用它:

let networkStatus = NetworkStatus.sharedInstance

override func awakeFromNib() {
    super.awakeFromNib()
    networkStatus.startNetworkReachabilityObserver()
}

如果您的网络状态发生任何变化,您都会收到通知。

【讨论】:

    【解决方案2】:

    将变量作为属性提升到类中。添加静态共享属性以使您的类成为单例。

        class ReachabilityManager {
            private let networkReachabilityManager = NetworkReachabilityManager()
            static let shared = ReachabilityManager()
            private override init () {
                super.init()
                networkReachabilityManager?.listener = { status in
                    //Post Notifications here
                    }
                }
            }
            func startListening() {
                networkReachabilityManager.startListening()
            }
        }
    

    静态属性默认是惰性的,因此当您调用 ReachabilityManager.shared.startListening() 时,它将在第一次实例化单例,后续调用使用现有的共享实例。

    【讨论】:

    • init private 确保我们不能实例化多个单例对象。
    猜你喜欢
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    相关资源
    最近更新 更多