yes*_*joe 14 macos cocoa swift
我正在尝试在恢复互联网连接并且updateOnConnection变量为真时调用函数.这是我的代码:
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)
}
Run Code Online (Sandbox Code Playgroud)
我的问题是线条:
if self.updateOnConnection {
self.refreshWallpaper()
}
Run Code Online (Sandbox Code Playgroud)
导致错误:" A C function pointer cannot be formed from a closure that captures context"
我不知道如何检查监视状态updateOnConnection并调用refreshWallpaper()监视Internet连接中的更改的闭包.我该如何解决这个问题,或者我应该使用完全不同的解决方法?
Mar*_*n R 17
类似于如何使用实例方法作为仅接受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)
}
Run Code Online (Sandbox Code Playgroud)
有关此机制的更多详细信息,另请参见如何将self转换为UnsafeMutablePointer <Void>键入swift.
备注: if flags.rawValue == 0可以表达得稍微优雅一些if flags.isEmpty,但实际应该检查的是if flags.contains(.Reachable).
更新Swift 3(Xcode 8 beta 6):
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)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6004 次 |
| 最近记录: |