问题描述
拔出头发让CFNotificationCenterAddObserver
在Swift中工作.
Pulling my hair out getting CFNotificationCenterAddObserver
to work in Swift.
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
UnsafePointer<Void>(self),
iosLocked,
"com.apple.springboard.lockcomputer" as CFString,
nil,
CFNotificationSuspensionBehavior.DeliverImmediately)
iOS文档列出了它,我在回调和不安全的指针上尝试了无数次迭代,但均未成功.
The iOS docs have it listed and I have tried countless iterations on the callback and the unsafe pointer with no success.
上面的函数调用导致此错误消息,这似乎是正确的初始化:
The above function call results in this error message, which seems to be the correct init:
Cannot invoke 'init' with an argument list of type '(CFNotificationCenter!, $T4, () -> (), CFString, NilLiteralConvertible, CFNotificationSuspensionBehavior)'
我还尝试过以的形式连接到objc此处的帖子提出了建议,但没有成功.
I also tried bridging to objc as this post here suggests, but without success.
这是我的桥梁:
LockNotifierCallback.h:
LockNotifierCallback.h:
#import <Foundation/Foundation.h>
@interface LockNotifierCallback : NSObject
+ (void(*)(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo))notifierProc;
@end
和LockNotifierCallback.m:
and 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
具有更新的CFNotificationCenterAddObserver调用,如下所示:
with updated CFNotificationCenterAddObserver call as follows:
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
LockNotifierCallback.notifierProc,
iosLocked,
"com.apple.springboard.lockcomputer" as CFString,
nil,
CFNotificationSuspensionBehavior.DeliverImmediately)
,当然还有LockNotifierCallback.h在我的Bridging标头中.错误继续:
and of course LockNotifierCallback.h is in my Bridging header. Error continues:
Cannot convert the expression's type '(CFNotificationCenter!, () -> CFunctionPointer<((CFNotificationCenter!, UnsafeMutablePointer<Void>, CFString!, UnsafePointer<Void>, CFDictionary!) -> Void)>, () -> (), CFString, NilLiteralConvertible, CFNotificationSuspensionBehavior)' to type 'StringLiteralConvertible'
推荐答案
我在DarwinNotifications中遇到了一些问题,您可以尝试使用此包装器类只需在桥接文件中包含头文件即可.而且您可以快速使用它.
I had some issues with DarwinNotifications, you can try using this wrapper classjust include header file in your bridging file. And you can use it in swift.
DarwinNotificationsManager.h:
DarwinNotificationsManager.h :
#import <Foundation/Foundation.h>
#ifndef DarwinNotifications_h
#define DarwinNotifications_h
@interface DarwinNotificationsManager : NSObject
@property (strong, nonatomic) id someProperty;
+ (instancetype)sharedInstance;
- (void)registerForNotificationName:(NSString *)name callback:(void (^)(void))callback;
- (void)postNotificationWithName:(NSString *)name;
@end
#endif
DarwinNotificationsManager.m:
DarwinNotificationsManager.m :
#import <Foundation/Foundation.h>
#import "DarwinNotificationsManager.h"
@implementation DarwinNotificationsManager {
NSMutableDictionary * handlers;
}
+ (instancetype)sharedInstance {
static id instance = NULL;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
- (instancetype)init {
self = [super init];
if (self) {
handlers = [NSMutableDictionary dictionary];
}
return self;
}
- (void)registerForNotificationName:(NSString *)name callback:(void (^)(void))callback {
handlers[name] = callback;
CFNotificationCenterRef center = CFNotificationCenterGetDarwinNotifyCenter();
CFNotificationCenterAddObserver(center, (__bridge const void *)(self), defaultNotificationCallback, (__bridge CFStringRef)name, NULL, CFNotificationSuspensionBehaviorDeliverImmediately);
}
- (void)postNotificationWithName:(NSString *)name {
CFNotificationCenterRef center = CFNotificationCenterGetDarwinNotifyCenter();
CFNotificationCenterPostNotification(center, (__bridge CFStringRef)name, NULL, NULL, YES);
}
- (void)notificationCallbackReceivedWithName:(NSString *)name {
void (^callback)(void) = handlers[name];
callback();
}
void defaultNotificationCallback (CFNotificationCenterRef center,
void *observer,
CFStringRef name,
const void *object,
CFDictionaryRef userInfo)
{
NSLog(@"name: %@", name);
NSLog(@"userinfo: %@", userInfo);
NSString *identifier = (__bridge NSString *)name;
[[DarwinNotificationsManager sharedInstance] notificationCallbackReceivedWithName:identifier];
}
- (void)dealloc {
CFNotificationCenterRef center = CFNotificationCenterGetDarwinNotifyCenter();
CFNotificationCenterRemoveEveryObserver(center, (__bridge const void *)(self));
}
@end
您可以像这样迅速使用它:
In swift you can use it like this :
let darwinNotificationCenter = DarwinNotificationsManager.sharedInstance()
darwinNotificationCenter.registerForNotificationName("YourNotificationName"){
//code to execute on notification
}
这篇关于如何在iOS的Swift中正确使用CFNotificationCenterAddObserver的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!