没有从父应用程序发送到Watch应用程序的数组

时间:2015-07-29 17:20:41

标签: ios swift watchkit apple-watch

我正在尝试从父应用程序接收一个对象数组(从应用程序中的Parse中检索),以便在监视应用程序中显示。我一直在尝试一些不同的事情但没有成功。

以下是扩展程序中的代码:

override func awakeWithContext(context: AnyObject?) {
    super.awakeWithContext(context)

    var parkPassed = context as! String
    openParentAppWithPark(parkPassed)        
}

private func openParentAppWithPark(park: String) {
    WKInterfaceController.openParentApplication(["request": park], reply: { (reply, error) -> Void in
        println(reply)
    })
}

父应用中的代码:

func application(application: UIApplication, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]?, reply: (([NSObject : AnyObject]!) -> Void)!) {
        println("Test")

        if let userInfo = userInfo, request = userInfo["request"] as? NSArray {
            if request == "Park 1" {
                DataManager.sharedInstance.loadRides("Park 1")
            } else if request == "Park 2" {
                DataManager.sharedInstance.loadRides("Park 2")
            } else if request == "Park 3" {
                DataManager.sharedInstance.loadRides("Park 3")
            } else {
               DataManager.sharedInstance.loadRides("Park 4")
            }

            let rides = DataManager.sharedInstance.rideArray
            println("Rides: \(rides)")

            reply(["rideData": rides])
            return
        }
        reply([:])
}

println我第一次尝试加载时总是返回nil,然后每隔一次[:]。我假设这是因为请求在应用程序有时间从Parse加载数据之前超时?此外,永远不会调用打印“Test”的println

2 个答案:

答案 0 :(得分:3)

在扩展程序中,您通过String密钥将parkrequest)传递给父应用程序,但在父应用程序中,您正在测试是否{{ 1}}是userInfo["request"]或不是NSArray。您应该测试String,如:

if let userInfo = userInfo, request = userInfo["request"] as? String {

答案 1 :(得分:0)

首先将一个后台任务断言添加到openParentCall,你可以在这里找到更多的上下文:Background Task Watchkit

    let backgroundTask = application.beginBackgroundTaskWithExpirationHandler { NSLog("TIME UP")}
   ///do code
   reply(callback)
   //
   application.endBackgroundTask(backgroundId)

现在对于实际的handleWatchKitExtensionRequest调用,我会将第一行更改为

  if let request = userInfo["request"] as? String {

现在,对于println(" Test"),如果您没有附加到使用parentApplication进行处理,则不会打印到控制台,然后println将不会注销。 如果乘坐数据返回空,那么我将检查此功能:

  DataManager.sharedInstance.loadRides(ride: String)

确保它实际上返回了您需要的正确数据。附加到进程并在每个case上放置一个断点并检查是否正在调用其中一个case并跳转到loadRides函数以确保它从它返回。作为旁注,您在回复块中发回的信息必须是属性列表,否则回复块将始终失败。