2017-05-30 29 views
6

我正在尝试使用Parse LiveQueries。 我用这个解析“引导”:“https://github.com/parse-community/parse-server”,
我可以看到日志:info: Create new client: 1
但我只是虽然我已经订阅但没有得到查询更新。它甚至没有达到subscription.handle的处理程序。解析云 - LiveQueries - iOS客户端不起作用

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版雨燕):

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) 
    } 
} 

回答

3

该代码的问题在于,您将此代码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的内存地址被保留。

+0

我以前也试过这个,同样的事情。 – Etgar

+1

更新:好的我刚刚尝试过,并且你是对的。 IDK为什么它在我前几天尝试时不起作用,可能又犯了一个错误。 非常感谢!你已经赢得了50分的声​​誉! :) 编辑:我只能在7小时内给您奖赏 – Etgar

+0

欢迎您。文档很缺乏,所以这是最误解的。尤其是Firebase的套接字是如何工作的,因为即使在函数内声明,它的内存地址仍然存在(它们使用全局处理程序,这就是为什么) –

-1

你必须查询之前登记类,如:

Channel.registerSubclass() 
+0

我已经做到了。 – Etgar