Просмотр передачи контроллера - PullRequest
0 голосов
/ 30 октября 2019

Я столкнулся с ошибкой с моим кодом. В настоящее время у меня есть статус доступности, который контролирует мое интернет-соединение. Если пользователь теряет подключение к Интернету, а затем восстанавливает его, отображается корневой контроллер. Я хотел бы, чтобы текущий контроллер представления пользователя сохранялся.

Я не уверен, так ли это, потому что мой MGLMapView каким-то образом вызывает перезагрузку? Пожалуйста, может кто-нибудь сказать мне, как остановить передачу экрана?

Мой код состояния доступности такой:

let ReachabilityStatusChangedNotification = "ReachabilityStatusChangedNotification"

enum ReachabilityType: CustomStringConvertible {
case wwan
case wiFi

var description: String {
    switch self {
    case .wwan: return "WWAN"
    case .wiFi: return "WiFi"
    }
}
}

enum ReachabilityStatus: CustomStringConvertible  {
case offline
case online(ReachabilityType)
case unknown

var description: String {
    switch self {
    case .offline: return "Offline"
    case .online(let type): return "Online (\(type))"
    case .unknown: return "Unknown"
    }
}
}

public class Reach {

func connectionStatus() -> ReachabilityStatus {
    var zeroAddress = sockaddr_in()
    zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size)
    zeroAddress.sin_family = sa_family_t(AF_INET)

    guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
        $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
            SCNetworkReachabilityCreateWithAddress(nil, $0)
        }
    }) else {
        return .unknown
    }

    var flags : SCNetworkReachabilityFlags = []
    if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) {
        return .unknown
    }

    return ReachabilityStatus(reachabilityFlags: flags)
}


func monitorReachabilityChanges() {
    let host = "google.com"
    var context = SCNetworkReachabilityContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil)
    let reachability = SCNetworkReachabilityCreateWithName(nil, host)!

    SCNetworkReachabilitySetCallback(reachability, { (_, flags, _) in
        let status = ReachabilityStatus(reachabilityFlags: flags)

        NotificationCenter.default.post(name: Notification.Name(rawValue: ReachabilityStatusChangedNotification),
                                        object: nil,
                                        userInfo: ["Status": status.description])

    }, &context)

    SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetMain(), RunLoop.Mode.common as CFString)
}

}

extension ReachabilityStatus {
init(reachabilityFlags flags: SCNetworkReachabilityFlags) {
    let connectionRequired = flags.contains(.connectionRequired)
    let isReachable = flags.contains(.reachable)
    let isWWAN = flags.contains(.isWWAN)

    if !connectionRequired && isReachable {
        if isWWAN {
            self = .online(.wwan)
        } else {
            self = .online(.wiFi)
        }
    } else {
        self =  .offline
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...