【问题标题】:Getting 'unrecognised selector' from NSNotificationCenter从 NSNotificationCenter 获取“无法识别的选择器”
【发布时间】:2016-08-22 11:01:07
【问题描述】:

我正在尝试在 NSNotificationCenter 中实现一个观察者。而不是使用self 作为观察者,我想创建一个小对象来完成它:

typedef void (^ErrorCallback)(NSError*);
typedef void (^SuccessCallback)();
typedef void (^ReplicationChanged) (NSNotification*);

@interface SyncParams : NSObject

@property (copy) ErrorCallback errorCallback;
@property (copy) SuccessCallback successCallback;
@property (copy) ReplicationChanged replicationChanged;//this used to observe

- (void)replicationChanged:(NSNotification*)notification;

@end

@implementation SyncParams

@end

然后我创建了一个观察者的实例:

SyncParams* params = [SyncParams alloc];
params.replicationChanged = ^(NSNotification* notification) {
    //do stuff here
}; 

最后将其添加到 NSNotificationCenter:

[[NSNotificationCenter defaultCenter] addObserver: params
                                         selector: @selector(replicationChanged:)
                                             name: kCBLReplicationChangeNotification
                                           object: replicationObject];

但我收到此错误:Exception '-[SyncParams replicationChanged:]: unrecognized selector sent to instance 0x7ff945c049a0' was thrown

我对 Objective-c 很陌生!有什么指点吗?

【问题讨论】:

  • replicationChanged: 的实现是什么样的?
  • 我没有看到,replicationChanged: 已实现。
  • 这不就是:params.replicationChanged = ^(NSNotification* notification) { //do stuff here }; ??
  • 你曾经正确调试过这个吗?我遇到了同样的问题。

标签: objective-c observer-pattern nsnotificationcenter couchbase-lite


【解决方案1】:

是的,也不是,我最终得到了以下结果:

[[NSNotificationCenter defaultCenter] addObserverForName:kCBLReplicationChangeNotification object:repl queue:nil usingBlock:^(NSNotification *notification) {

    NSString *status;
    if (repl.status == kCBLReplicationActive) {
        NSLog(@"Repication in progress");
        status = @"in-progrss";
    } else if (repl.status == kCBLReplicationOffline) {
        NSLog(@"Sync in offline");
        status = @"offline";
    } else if (repl.status == kCBLReplicationStopped) {
        NSLog(@"Sync in stopped");
        status = @"stopped";
    } else if (repl.status == kCBLReplicationIdle) {
        NSLog(@"Sync in idle");
        status = @"idle";
    }

    NSError *error = repl.lastError;
    if(error) {
        status = @"error";
        NSLog(@"replication error %@", error.code);
    }

    NSDictionary *dictionary = @{
                                 @"type": type,
                                 @"changesCount": @(repl.changesCount),
                                 @"completedChangesCount": @(repl.completedChangesCount),
                                 @"running": @(repl.running),
                                 @"status": status,
                                 @"suspended": @(repl.suspended),
                                 };

    [self sendEventWithName:@"replicationChanged" body:dictionary];

}];

不过,我只收到一个回调,当它启动时。

【讨论】:

    猜你喜欢
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多