Estrarre i miei capelli ottenendo CFNotificationCenterAddObserver
per lavorare in Swift.Come utilizzare correttamente CFNotificationCenterAddObserver in Swift per iOS
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
UnsafePointer<Void>(self),
iosLocked,
"com.apple.springboard.lockcomputer" as CFString,
nil,
CFNotificationSuspensionBehavior.DeliverImmediately)
Il iOS docs hanno elencato e ho cercato innumerevoli iterazioni sul callback e il puntatore non sicuro senza successo.
I suddetti risultati chiamata di funzione in questo messaggio di errore, che sembra essere init corretto:
Cannot invoke 'init' with an argument list of type '(CFNotificationCenter!, $T4,() ->(), CFString, NilLiteralConvertible, CFNotificationSuspensionBehavior)'
Ho anche provato a colmare objc come suggerisce this post here, ma senza successo.
Ecco il mio ponte:
LockNotifierCallback.h:
#import <Foundation/Foundation.h>
@interface LockNotifierCallback : NSObject
+ (void(*)(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo))notifierProc;
@end
e LockNotifierCallback.m:
#import "LockNotifierCallback.h"
static void lockcompleteChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {
NSLog(@"success");
}
@implementation LockNotifierCallback
+ (void(*)(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo))notifierProc {
return lockcompleteChanged;
}
@end
con la chiamata CFNotificationCenterAddObserver aggiornata come segue:
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
LockNotifierCallback.notifierProc,
iosLocked,
"com.apple.springboard.lockcomputer" as CFString,
nil,
CFNotificationSuspensionBehavior.DeliverImmediately)
e ovviamente LockNotifierCallback.h si trova nella mia intestazione Bridging. Errore continua:
Cannot convert the expression's type '(CFNotificationCenter!,() -> CFunctionPointer<((CFNotificationCenter!, UnsafeMutablePointer<Void>, CFString!, UnsafePointer<Void>, CFDictionary!) -> Void)>,() ->(), CFString, NilLiteralConvertible, CFNotificationSuspensionBehavior)' to type 'StringLiteralConvertible'
'CFNotificationCenterAddObserver' prende un' CFunctionPointer' che non puoi davvero creare da Swift (vedi http://stackoverflow.com/a/25514748/3300036). Puoi aggirare il problema facendo un bridging Objective-C simile a questo: http://stackoverflow.com/a/26139259/3300036 –
Grazie Mark, ma perché sarebbe sotto una rapida dichiarazione nei documenti ios? https://developer.apple.com/Library/ios/documentation/CoreFoundation/Reference/CFNotificationCenterRef/index.html#//apple_ref/c/func/CFNotificationCenterAddObserver – zooster
Puoi ancora usarlo da Swift, devi solo passarlo una funzione definita in C o Objective-C e non una funzione Swift di chiusura. –