2014-09-23 49 views
3
失败

我尝试使用下面的代码来设置一个回调的SCNetworkReachabilitySCNetworkReachabilitySetCallback斯威夫特

// Create callback 
let callback:(SCNetworkReachability!, SCNetworkReachabilityFlags, UnsafeMutablePointer<Void>) ->() = { (target: SCNetworkReachability!, flags: SCNetworkReachabilityFlags, info: UnsafeMutablePointer<Void>) in 
    // Do something 
} 

// Create UnsafeMutablePointer and initialise with callback 
let p = UnsafeMutablePointer<(SCNetworkReachability!, SCNetworkReachabilityFlags, UnsafeMutablePointer<Void>) -> Void>.alloc(1) 
p.initialize(callback) 

// convert UnsafeMutablePointer to COpaquePointer 
let cp = COpaquePointer(p) 

// convert COppaquePointer to CFunctionPointer 
let fp = CFunctionPointer<(SCNetworkReachability!, SCNetworkReachabilityFlags, UnsafeMutablePointer<Void>) -> Void>(cp) 

if SCNetworkReachabilitySetCallback(reachability, fp, nil) != 0 { 

    println(SCError()) // SCError() is returning 0 
} 

SCNetworkReachabilitySetCallback调用失败 - 任何人都有任何与此成功?任何想法这可能是错误的?

回答

1

作为迅速1.2不能传递编写的函数在迅速使用CFunctionPointer。它主要被引入用于将已经在C中定义的函数指针传递给其他C(或objectiveC)例程。

一种可能的解决办法是使用objc_block在迅速e.g:

let block: @objc_block (SCNetworkReachabilityRef, SCNetworkReachabilityFlags, UnsafePointer<Void>) -> Void = { 
     [weak self] 
     (reachability: SCNetworkReachabilityRef, flags: SCNetworkReachabilityFlags, data: UnsafePointer<Void>) in 

     // Do something e.g. check if network reachability has changed 

     if flags & SCNetworkReachabilityFlags(kSCNetworkReachabilityFlagsReachable) == 0 { 

     } 
    } 

    let blockObject = imp_implementationWithBlock(unsafeBitCast(block, AnyObject.self)) 
    let fp = unsafeBitCast(blockObject, SCNetworkReachabilityCallBack.self) 

    // e.g. you can use 169.254.0.0 for local wifi connection 

    var reachability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, ("169.254.0.0" as NSString).UTF8String).takeRetainedValue() 
    var context = SCNetworkReachabilityContext() 

    if SCNetworkReachabilitySetCallback(reachability!, fp, &context) == 1 { 
     if SCNetworkReachabilityScheduleWithRunLoop(reachability!, CFRunLoopGetCurrent(), NSDefaultRunLoopMode) == 0 { 
      println(SCError()) 
     } 
    } 
+0

可以请你也分享目标-C代码? – 2017-06-14 05:25:54