在Swift for PubNub 4.0中建立回调以接收消息

时间:2015-07-06 20:18:54

标签: objective-c swift pubnub respondstoselector

在我看来,PubNub在Swift中开始使用的文档不适用于早于PubNub 4.0的版本。我无法成功建立回调以注册PubNub。

我的代码:

class Communicator: NSObject, PNObjectEventListener {

    var pubNubClient: PubNub

    override init(){
        let config = PNConfiguration(
            publishKey: "my_publish_key",
            subscribeKey: "my_subscribe_key"
        )
        pubNubClient = PubNub.clientWithConfiguration(config);
        super.init()
        pubNubClient.addListener(self)
        pubNubClient.subscribeToChannels(["my_channel"], withPresence: false)
    }

    func didReceiveMessage(client: PubNub!, message: PNMessageResult!){
        /* THIS METHOD NEVER GETS REACHED */
    }
}

稍微深入了解PubNub源代码,这个区域似乎遇到了问题:

- (void)addListener:(id <PNObjectEventListener>)listener {

    dispatch_async(self.resourceAccessQueue, ^{

        if ([listener respondsToSelector:@selector(client:didReceiveMessage:)]) {
            /* this block is never reached!!! */
            [self.messageListeners addObject:listener];
        }

    /* Remaining Lines Stripped Away */
    });
}

我还是相对较新的Swift并与Objective C集成。我很好奇respondsToSelector是否存在问题,因为Objective C代码引用了Swift代码。

消息肯定会过去; PubNub库中还有另一个较低级别的功能,它记录了收到的所有消息。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:4)

4.0之前的版本已被弃用,并且不会完全按原样使用。

我建议完全迁移到最新的(4.0)SDK,新的iOS SDK已经消除了很多膨胀并且编译得更快。要开始查看this tutorial

总结一下,实例化PubNub客户端看起来如下:

let config = PNConfiguration( 
    publishKey: "Your_Pub_Key", 
    subscribeKey: "Your_Sub_Key")   
client = PubNub.clientWithConfiguration(config) 
client?.addListener(self) 
client?.subscribeToChannels(["Your_Channel"], withPresence: false)       

新的didReceiveMessage函数如下所示:

func client(client: PubNub!, didReceiveMessage message: PNMessageResult!, withStatus status: PNErrorStatus!) { 
     //Do Something like
     //println(message) 
}

答案 1 :(得分:3)

通过添加:

解决
func client(client: PubNub!, didReceiveMessage message: PNMessageResult!) {

}

答案 2 :(得分:0)

有关如何解析收到的PNMessageResult的文档很少。以下是我处理它的方式:

func client(client: PubNub!, didReceiveMessage message: PNMessageResult!) {

  let encodedMessage = message.data.valueForKey("message") as! NSDictionary
  let messageType    = encodedMessage["meta"]! as! String
  let messageString  = encodedMessage["data"]!["msg"]! as! String

  print("PubNub: [\(messageType)] \(messageString)") 
}

答案 3 :(得分:0)

添加 _客户端对我有效!

func client(_ client: PubNub, didReceiveMessage message: PNMessageResult) {
    print("Pubnub Message: \(message)")
}