当前位置: 首页 > 面试题库 >

Swift:将数据传递到捕获上下文的闭包

廖招
2023-03-14
问题内容

我正在尝试在互联网连接恢复且updateOnConnection变量为true 时调用一个函数。这是我的代码:

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)
}

我的问题是这些行:

        if self.updateOnConnection {
            self.refreshWallpaper()
        }

导致错误:“ A C function pointer cannot be formed from a closure that captures context

我不确定如何检查状态updateOnConnection并调用refreshWallpaper()监视Internet连接变化的闭包。如何解决此问题,或者我应该使用完全不同的解决方法?


问题答案:

类似于如何将实例方法用作仅使用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)

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)
}


 类似资料:
  • 问题内容: 我有一个想要完全适应我想要的应用程序 我一直在关注Seemu Apps的Youtube教程,但是我需要添加一个可选的ViewController来完成它 该应用程序有2个显示车辆的tableViews,如果我们单击第一个tableView的一行,则第二个tableView将向我们显示选定车辆的列表。 这是到目前为止我们所拥有的:(图像链接,因为我在stackOverFlow上没有十分的

  • 我最近开始学习Swift,遇到了一个关于闭包的问题。我试图将开车的参数传递给func travel并收到错误消息:无法将类型'()'的值转换为预期的参数类型'()- 有人能善意地建议吗?赞赏!

  • 问题内容: 我以为这是我可以轻松搜索的东西,但也许我没有问正确的问题… 如何在给定的javascript函数中设置“ this”所指的内容? 例如,与大多数jQuery函数一样,例如: 如何编写/调用自己的独立函数,并在调用时具有适当的“ this”引用?我使用jQuery,因此,如果有jQuery特定的方式可以做到,那将是理想的选择。 问题答案: Javascript 和方法允许您设置函数的 上

  • 问题内容: 我一直在寻找答案,但只能找到答案。 我有一个按钮可以选择。没有代码,我通过“接口”构建器进行设置。上,我有一个按钮,可以自行关闭 我想从视图传递回时传递一个字符串。我该怎么做呢?另外,我正在使用swift。 提前致谢! 问题答案: 有两种常见的模式,这两种模式都消除了viewController2明确了解viewController1的需要(这对于可维护性非常重要): 为您的viewC

  • 问题内容: 我想创建一个指令来组织按日期分组的显示数据。我还希望能够指定将显示各个行的指令。在一个完美的世界中,它看起来像这样(但又漂亮又漂亮) 这显然是行不通的,因此,如果您有更好的方法,请告诉我,但我希望能够按照以下方式做点事情: 然后像这样使用它: 我知道这很丑陋(并且不起作用,但是我敢肯定我可以通过一些调整使其工作),所以我真正要问的是,有没有更好的方法来做到这一点? 问题答案: 这个问题

  • 我有一个ngForm的singup页面。我尝试将数据传递到。ts文件,但未能在控制台上打印它们。