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)
})
}
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
In diesem Fall wo soll ich es genau nennen? – user1680944
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