Swift: die übergabe von Daten zu einem Verschluss versehen, der Kontext erfasst
Ich versuche, eine Funktion aufzurufen, wenn die internet-Verbindung wiederhergestellt ist und die updateOnConnection
variable true ist. Hier ist mein code:
func checkForConnection() {
let host = "reddit.com"
var context = SCNetworkReachabilityContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil)
let reachability = SCNetworkReachabilityCreateWithName(nil, host)!
SCNetworkReachabilitySetCallback(reachability, { (_, flags, _) in
if flags.rawValue == 0 { //internet is not connected
} else { //internet became connected
if self.updateOnConnection {
self.refreshWallpaper()
}
}
}, &context)
SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes)
}
Mein problem ist, dass die Linien:
if self.updateOnConnection {
self.refreshWallpaper()
}
Ursache der Fehlermeldung: "A C function pointer cannot be formed from a closure that captures context
"
Ich bin nicht sicher, wie Sie überprüfen den Zustand der updateOnConnection
- und call - refreshWallpaper()
im Verschluss, überwacht änderungen in der internet-Verbindung. Wie kann ich das beheben, oder ist es eine ganz andere Problemumgehung sollte ich verwenden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ähnlich wie in Die Verwendung von Instanz-Methode als callback-Funktion, die nur func oder literal-Verschluss, Sie haben zu konvertieren
self
zu einem void-Zeiger, store, im Rahmen,und konvertieren es zurück zu ein Zeiger auf ein Objekt in der Schließung:
Siehe auch Wie die Darsteller selbst zu UnsafeMutablePointer<Void> geben Sie in swift
für mehr details über diesen Mechanismus.
Bemerkung:
if flags.rawValue == 0
ausgedrückt werden kann, etwas mehrelegant wie
if flags.isEmpty
, aber was Sie eigentlich solltecheck ist
if flags.contains(.Reachable)
.Update für Swift 3 (Xcode 8 beta 6):
context.info
. I. e. Ich kann nicht kompiliert werden. Haben Sie eine Idee, warum dies der Fall sein könnte?passRetained()
sollten Sie nicht verwendentakeRetainedValue()
wie gut? würde nichttakeUnretainedValue
bewahren Sie Sie wieder von innen den Verschluss verursacht ein Leck?