2017-07-24 2 views
0

Ich versuche die Variable channels mit der Anzahl der Chat-Kanäle zu initialisieren, die in meiner SendBird-Chat-Anwendung verfügbar sind. Ich benutze für diesen Prozess eine Funktion namens: private func loadChannels(), um die Kanäle in die oben genannte Variable zu laden. Was ich nicht verstehe, ist, dass die Kanäle beim Aufruf der Funktion geladen werden und wie im folgenden Code angezeigt werden können. Wenn ich jedoch den Inhalt der gleichen Variablen channels außerhalb von loadChannels() anzeigen möchte, erhalte ich eine leere Variable. Was kann das Problem sein?Variable wird nicht initialisiert, wenn eine Funktion mit dem Beendigungshandler verwendet wird

import UIKit 
import SendBirdSDK 
import JSQMessagesViewController 


class ViewController: UIViewController { 


    var messages = [JSQMessage]() 

    var channels = [SBDOpenChannel]() 
    private var refreshControl: UIRefreshControl? 
    private var openChannelListQuery: SBDOpenChannelListQuery? 



    override func viewDidLoad() { 


     //connecting to the application 
     SBDMain.initWithApplicationId("1662A8E8-F45F-454B-9E5E-02362342ECC5") 

     //Connecting the user 
     SBDMain.connect(withUserId: "tahrisqalli", completionHandler: { (user, error) in 
      // ... 
      print("connected tahrisqalli") 


       print ("printing channels") 
       self.loadChannels() 
       print (self.channels) 


      print ("printing channels") 
      self.loadChannels() 
      // Here content of channels variable is empty 
      print (self.channels) 

     }) 



    } 

private func loadChannels() { 
     self.openChannelListQuery = SBDOpenChannel.createOpenChannelListQuery() 
     self.openChannelListQuery?.limit = 20 

     if self.openChannelListQuery?.hasNext == false { 
      return 
     } 

     self.openChannelListQuery?.loadNextPage(completionHandler: { (channels, error) in 
      if error != nil { 
       print ("error") 
       return 
      } 

      for channel in channels! { 

       self.channels.append(channel) 

      } 
      // Here content of channels is full with the correct channels 
      print (self.channels) 

     }) 
    } 
+0

Da Sie die 'channels' Eigenschaft in einem Abschluss-Handler sind auffüllt, meine Vermutung wäre, dass diese Prozedur noch aufgerufen werden soll (asynchron ?), wenn Sie die Anweisung 'print (...)' nach dem Aufruf von 'loadChannels()' erreichen. – dfri

+0

In diesem Fall wo soll ich es genau nennen? – user1680944

+3

Es gibt kein Problem. Lösche die 'print'-Zeile nach' self.loadChannels() ', da - wie bereits erwähnt - die Methode asynchron arbeitet und diese 'print'-Zeile bedeutungslos ist. – vadian

Antwort

1

Sie können es wie folgt tun:

import UIKit 
import SendBirdSDK 
import JSQMessagesViewController 


class ViewController: UIViewController { 


    var messages = [JSQMessage]() 

    var channels = [SBDOpenChannel]() 
    private var refreshControl: UIRefreshControl? 
    private var openChannelListQuery: SBDOpenChannelListQuery? 



    override func viewDidLoad() { 


     //connecting to the application 
     SBDMain.initWithApplicationId("1662A8E8-F45F-454B-9E5E-02362342ECC5") 

     //Connecting the user 
     SBDMain.connect(withUserId: "tahrisqalli", completionHandler: { (user, error) in 
      // ... 
      print("connected tahrisqalli") 


       print ("printing channels") 
       self.loadChannels(){ 
        print (self.channels) 
       } 



      //print ("printing channels") 
      //self.loadChannels() 
      // Here content of channels variable is empty 
      //print (self.channels) 

     }) 



    } 

private func loadChannels(callback: @escaping() -> void) { 
     self.openChannelListQuery = SBDOpenChannel.createOpenChannelListQuery() 
     self.openChannelListQuery?.limit = 20 

     if self.openChannelListQuery?.hasNext == false { 
      return 
     } 

     self.openChannelListQuery?.loadNextPage(completionHandler: { (channels, error) in 
      if error != nil { 
       print ("error") 
       return 
      } 

      for channel in channels! { 

       self.channels.append(channel) 

      } 
      // Here content of channels is full with the correct channels 
      // print (self.channels) 
      callback() 

     }) 
    } 
Verwandte Themen