[swift-users] Callback in Swift

John Brownie john_brownie at sil.org
Wed Jan 25 01:49:30 CST 2017


My macOS app shows a representation of the contents of various folders, 
so using FSEvents to track modifications from outside the app seemed to 
be the way to go. I am running into difficulty with writing the code 
with a callback, all in Swift. I must be doing something wrong, as I get 
a crash in the callback.

Code in my ViewController class:
         let scanTarget = [<the folders I monitor>]
         let scanCallback: FSEventStreamCallback = { (streamRef: 
ConstFSEventStreamRef, context: UnsafeMutableRawPointer?, count: Int, 
streamPtr: UnsafeMutableRawPointer, flags: 
UnsafePointer<FSEventStreamEventFlags>?, eventID: 
UnsafePointer<FSEventStreamEventId>?) in
             // Convert to appropriate pointer
             let theController = context?.bindMemory(to: 
ViewController.self, capacity: 1)
             // The following line crashes with a bad address exception
             theController?.pointee.<use the pointer to call a method>
         }
         var mutableSelf = self
         var theContext = FSEventStreamContext(version: 0, info: 
&mutableSelf, retain: nil, release: nil, copyDescription: nil)
         let scanInterval: CFTimeInterval = 5.0
         eventStream = FSEventStreamCreate(nil, scanCallback, 
&theContext, scanTarget as CFArray, 
FSEventStreamEventId(kFSEventStreamEventIdSinceNow), scanInterval, 
FSEventStreamCreateFlags(kFSEventStreamCreateFlagUseCFTypes))

The pointer I get back (as theController.pointee) is not valid, so I'm 
obviously doing this incorrectly. I had an idea that the mutableSelf 
variable should be a class variable, but that didn't really help.

So, how do I get a pointer to self inside the callback?
-- 
John Brownie
In Finland on furlough from SIL Papua New Guinea


More information about the swift-users mailing list