Parse Cloud - LiveQueries - клиент iOS не работает

Я пытаюсь использовать Parse LiveQueries. Я использую этот Parse "Bootstrap": " https://github.com/parse-community/parse-server",
Я вижу журналы: info: Create new client: 1,
но я просто не получаю обновление в запросе, хотя я подписался на него. Это даже не достигает обработчика subscription.handle,

config.json:

{
  "appId": "",
  "masterKey": "",
  "appName": "",
  "cloud": "./cloud/main",
  "databaseURI": "",
  "publicServerURL": "",    

  // Relevant
  "startLiveQueryServer": true,
  "liveQuery": {
    "classNames": ["Channel"]
  },
}

AppDelegate.swift:

// Initialize Parse.
let configuration = ParseClientConfiguration {
    $0.applicationId = self.PARSE_APP_ID
    $0.server = self.PARSE_SERVER
}
Parse.initialize(with: configuration)

AppDelegate.liveQueryClient = ParseLiveQuery.Client()

The Subscription Code (iOS Swift):

public static func listenSubscribedChannels(handler: @escaping (_ channel: Channel) -> Void) {
    var subscription: Subscription<PFObject>?

    let query: PFQuery<PFObject> = PFQuery(className: "Channel").whereKey("subscribers", containedIn: [PFUser.current()!.objectId])

    subscription = AppDelegate.liveQueryClient!.subscribe(query).handle(Event.updated) { _, channel in
        handler(channel)
    }
}

2 ответа

Решение

Проблема с этим кодом заключается в том, что вы размещаете этот код var subscription: Subscription<PFObject>? внутри функции.

Этот объект должен иметь возможность сохранять свой адрес памяти, чтобы он мог получать события.

Например.

class SomeClass {
    var objects: [PFObject] = []
    var subscription: Subscription<PFObject>?
    var subscriber: ParseLiveQuery.Client!
    let query = PFQuery(className: "Locations")

    func startListener() {
        // initialize the client
        subscriber = ParseLiveQuery.Client()

        // initialize subscriber and start subscription
        subscription = subscriber.subscribe(conversationQuery)

        // handle the event listenrs.
        _ = subscription?.handleEvent({ (_, event) in
            switch event {
            case .created(let object): 
                self.objects.append(object)
                // do stuff 

            default: 
                break // do other stuff or do nothing
            }
        })
    }
}

Как вы можете видеть из этого кода, я поместил переменные вне определения функции для Subscriptionадрес в памяти, который будет сохранен.

Вы должны зарегистрировать свой класс перед запросом, например:

Channel.registerSubclass()
Другие вопросы по тегам