类似于如何将实例方法用作仅使用func或立即数闭包的函数的回调中一样,您必须转换self
为void指针,将其存储在上下文中,然后将其转换回闭包中的对象指针:
func checkForConnection() {
let host = "reddit.com"
var context = SCNetworkReachabilityContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil)
context.info = UnsafeMutablePointer(Unmanaged.passUnretained(self).toOpaque())
let reachability = SCNetworkReachabilityCreateWithName(nil, host)!
SCNetworkReachabilitySetCallback(reachability, { (_, flags, info) in
if flags.rawValue == 0 { //internet is not connected
} else { //internet became connected
let mySelf = Unmanaged<ViewController>.fromOpaque(COpaquePointer(info)).takeUnretainedValue()
if mySelf.updateOnConnection {
mySelf.refreshWallpaper()
}
}
}, &context)
SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetMain(), kcfRunLoopCommonModes)
}
备注: if flags.rawValue == 0
可以表示得稍微优雅一些if flags.isEmpty
,但是您 实际上 应该检查的是if flags.contains(.Reachable)
。
func checkForConnection() {
let host = "reddit.com"
var context = SCNetworkReachabilityContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil)
context.info = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())
let reachability = SCNetworkReachabilityCreateWithName(nil, host)!
SCNetworkReachabilitySetCallback(reachability, { (_, flags, info) in
if let info = info {
if flags.rawValue == 0 { //internet is not connected
} else { //internet became connected
let mySelf = Unmanaged<ViewController>.fromOpaque(info).takeUnretainedValue()
// ...
}
}
}, &context)
SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetMain(), CFRunLoopMode.commonModes.rawValue)
}