需要在我的Firebreath项目中添加NSDistributedNotification观察器

时间:2011-12-30 13:52:18

标签: objective-c firebreath

我需要从我的cocoa app向我的firebreath项目发送分发通知,所以我需要在我的firebreath代码中创建一个观察者和一个选择器。 我将类扩展名更改为“.mm”以支持objective-c代码。我的firebreath项目中已有Objective-c代码,工作正常。但是当我尝试创建一个观察者时,我的代码中出现错误,我不知道如何解决它。

这是firebreath项目的源代码:

//This is the selector 
- (void)receiveAppConfirmationNotification:(NSNotification*)notif{
    //The application is alive.
    NSLog(@"The application is alive!!!!!!!!");
}

std::string MyProjectAPI::bgp(const std::string& val)
{       
    //Add an observer to see if the application is alive.
    NSString *observedObject = @"com.test.net";
    NSDistributedNotificationCenter *center = [NSDistributedNotificationCenter defaultCenter];
    [center addObserver: self
               selector: @selector(receiveAppConfirmationNotification:)
                   name: @"App Confirmation Notification"
                 object: observedObject];
}

以下是我的错误:

... firebreath /../projects / MyProject / MyProjectAPI.mm:133:错误:在' - '标记之前预期的unqualified-id。这是我定义“receiveAppConfirmationNotification”方法的行。

... firebreath /../projects / MyProject / MyProjectAPI.mm:157:错误:未在此范围内声明'self'。

如何定义选择器? 如何将观察者添加为类本身?

2 个答案:

答案 0 :(得分:0)

选择器必须是objective-c ++类的一部分;你不能把它扔在那里的任何地方,它应该在班级的@implementation部分。

为了保持兼容性,我建议在.mm文件中同时放置@interface和@implementation部分,以便.h文件与C ++兼容,但这取决于你;如果你这样做会更容易。如果需要,您可以使用pimpl模式来帮助解决这个问题。

答案 1 :(得分:0)

我做了界面和实现,代码没有错误。问题是我能够向我的cocoa应用程序发送通知,但是我无法从应用程序向插件重新发送通知。 这是头文件:

#ifdef __OBJC__

@interface FBMyProject : NSObject {
    NSString *parameter_val;
}

@property (nonatomic, retain) NSString *parameter_val;

-(void) receiveAppConfirmationNotification:(NSNotification*)notif;

@end
#endif

class MyProjectAPI : public FB::JSAPIAuto
{
    public:
    ...
}
#endif

这是我的源文件:

@implementation FBMyProject
@synthesize parameter_val;

  -(void) receiveAppConfirmationNotification:(NSNotification*)notif{
       //The application is alive.
       NSLog(@"The application is alive!!!!!!!!");
   }

  - (id)init
  {
      self = [super init];
      if (self) {
          NSString *observedObject = @"test.com";
          NSDistributedNotificationCenter *center = [NSDistributedNotificationCenter defaultCenter];
          [center addObserver: self
                     selector: @selector(receiveAppConfirmationNotification:)
                         name: @"App Confirmation Notification"
                       object: observedObject];

      }
      return self;
  }

  - (void)dealloc
  {
      // unregister notification
      [[NSDistributedNotificationCenter defaultCenter] removeObserver: self 
                                                                 name: @"App Confirmation Notification"
                                                               object: nil];

      [self.parameter_val release];
      [super dealloc];
  }
@end



std::string MyProjectAPI::bgp(const std::string& val)
{       
    FBMyProject *my_project = [[FBMyProject alloc] init];
    my_project.parameter_val = [NSString stringWithUTF8String:val.c_str()];
    [my_project release];

    return val;
}

以下是我在cocoa应用程序中的来源:

NSDictionary *data = [NSDictionary dictionaryWithObjectsAndKeys:
                      @"OK", @"confirmation", 
                      nil];

//Post the notification
NSString *observedObject = @"test.com";
NSDistributedNotificationCenter *center = [NSDistributedNotificationCenter defaultCenter];
[center postNotificationName: @"App Confirmation Notification"
                      object: observedObject
                    userInfo: data
          deliverImmediately: YES];