2016-04-22 2 views
0

В моем приложении Swift я создаю PubNub на viewDidLoad с правильной конфигурацией , а затем присоединяюсь к каналу. Тем не менее, похоже, что он вообще не присоединяется к каналу, если я не запускаю действие кнопки отправки на . Отправить сообщение (я выбрал код конфигурации/соединения канала в кнопке «Отправить» , чтобы посмотреть, будет ли это работать) , Код в функции кнопки отправки - , идентичный коду в viewDidLoad, но код в viewDidLoad равен , который по-прежнему игнорируется. Это расстраивает, потому что текущий пользователь моего приложения не отправит сообщения, отправленные на канал, если пользователь сначала не отправит сообщение.Не удается получить сообщение PubNub, если я не опубликую первое сообщение

Вот код в контроллере представления (я удалил много кода, так что легче смотреть на Если вы думаете, что проблема лежит в другом месте я могу разместить больше.):

class MessageViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate, PNObjectEventListener{ 

    var pubNub: PubNub! 

    var pnConfiguration: PNConfiguration! 

    var ids: String = "" 

@IBAction func sendButton(sender: UIButton) { 

     //create Pubnub channel 
     pnConfiguration = PNConfiguration(publishKey: "key", subscribeKey: "key") 
     pnConfiguration.uuid = currentUser.objectId! 
     print(pnConfiguration.uuid) 
     pubNub = PubNub.clientWithConfiguration(pnConfiguration) 
     let channelName = ids as String 
     let channelArray: [String] = [channelName] 
     pubNub.subscribeToChannels(channelArray, withPresence: true) 
     pubNub.publish(self.messageText.text!, toChannel: channelName, compressed: false, withCompletion: nil) 
     pubNub.addListener(self) 
     self.messageText.enabled = true 
     self.view.userInteractionEnabled = true 

     dispatch_async(dispatch_get_main_queue()) { 
      self.messageText.text = "" 
      self.messageTableView.reloadData() 
     } 
    } 

override func viewDidLoad() { 
     super.viewDidLoad() 

     //Query that sets self.ids = user1.objectId! + user2.objectId! 

     //set Pubnub config 
     pnConfiguration = PNConfiguration(publishKey: "key", subscribeKey: "key") 
     pubNub = PubNub.clientWithConfiguration(pnConfiguration) 
     pnConfiguration.uuid = currentUser.objectId! 
     //create channel 
     let channelName = ids as String 
     print(channelName) 
     let channelArray: [String] = [channelName] 
     pubNub.subscribeToChannels(channelArray, withPresence: true) 
     pubNub.addListener(self) 

     dispatch_async(dispatch_get_main_queue()) { 
      self.messageTableView.reloadData() 
     } 
    } 

EDIT:

После просмотра журналов это похоже на то, почему он не работает, потому что он присоединяется к каналу под названием «», хотя print(channelName) возвращает имя реального канала. Почему он не берет название канала? Разве это не правильный тип данных?

ответ

1

В вашем фрагменте кода я не вижу места, где вы установили реальное значение для идентификаторов переменных, которые вы объявляете в строке # 7. Таким образом, значение использования клиента, которое хранится в этой переменной: ""
Я думаю, что эта переменная изменилась в течение жизненного цикла контроллера и настроена на правильное значение, прежде чем вы нажмете sendButton, но недоступны в момент загрузки вида.

С наилучшими пожеланиями, Сергей

+0

Спасибо за помощь! Это привело меня к правильному пути. По какой-то причине клиент Pubnub инициализировался до того, как мои идентификаторы были установлены в запросе Parse. Я переместил код init в отдельную функцию и теперь вызываю функцию сразу после создания идентификаторов. Эта часть работает сейчас. По какой-то причине мое сообщение UUID неправильно настроено. Он игнорирует мой код 'pnConfiguration.uuid'. Он печатает правильный UUID, но когда я действительно отправляю сообщение, message.uuid в функции клиента возвращает совсем другое значение – winston

+0

Есть ли другой метод, который я должен использовать для установки сообщения uuid? Кроме кода 'pnConfiguration.uuid'? – winston

+0

@james, что _uuid_ предназначен для отладки и предоставляет информацию о самом клиенте-клиенте. Если вам необходимо, чтобы удаленные приемники сообщений знали о UUID пользователя, вам необходимо отправить его как часть полезной нагрузки сообщения. –

Смежные вопросы