swift - iPhone AppDelegate 仅将数组的第一个对象返回给 Watch OS 2 iOS 9

标签 swift ios9 appdelegate watchos-2

我刚刚从 Watch OS 1 教程中学习了如何创建 Watch 应用,除了 Watch 和 iPhone 之间的通信之外,大部分内容都可以转换为 OS 2。以下是我正在采取的步骤:

1 - 观察 InterfaceController.swift - 创建一个 WCSession,如果用户登录或未登录,则将消息发送到 iPhone。如果是,则询问表格数据,如果没有,则显示一个标签以转到电话。

2 - 我正确地获取用户是否登录,然后我要求提供一组狗名称来填充我的表。

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

    if (WCSession.isSupported()) {
        session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()
        print("Activated Session ----")

        if session.reachable == true {


            session.sendMessage(["content" : "isLoggedIn"], replyHandler: { (result) -> Void in

                if let response = result["isLoggedIn"] as? String {

                    if response == "true" {

                        userLoggedOn = true


                        self.session.sendMessage(["content":"getDogNames"], replyHandler: { (result) -> Void in

                            if let nameRequest = result as? [String:[String]] {

                                if let dogData = nameRequest["names"] {

                                    if dogData.count > 0 {

                                        dogNames = dogData
                                        self.logInLabel.setHidden(true)
                                        self.loadTableData()
                                    }

                                    else {

                                        self.logInLabel.setHidden(false)
                                        self.logInLabel.setText("Add dog profiles from iPhone")
                                    }

                                    print(dogData)

                                }
                            }

                            }, errorHandler: { (error) -> Void in
                                print("got names error")
                        })

                    } else {

                        userLoggedOn = false
                        self.logInLabel.setText("Create a profile from  iPhone")
                    }
                }
                }, errorHandler: { (error) -> Void in
                    print("error:------ /(error)")
            })
        }
    }   
}

3 - iPhone AppDelegate.swift - 在我的结果中,我仅获取从 parse.com 数据库查询的数组的第一个对象。

@available(iOS 9.0, *)
func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {

    if let watchMessage = message as? [String : String] {

        if let content = watchMessage["content"] {

            if content == "isLoggedIn" {

                if PFUser.currentUser() != nil {

                    replyHandler(["isLoggedIn":"true"])

                }

                else {

                    replyHandler(["isLoggedIn":"false"])
                }

            } else if content == "getDogNames" {

                let query = PFQuery(className: "dogInfo")
                query.whereKey("userId", equalTo: (PFUser.currentUser()?.objectId)!)
                query.orderByAscending("dogName")
                query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in

                    if error == nil && objects!.count > 0 {

                        for object in objects! {

                            var dogsArray = [String]()

                            if let message = object["dogName"] as? String {

                                dogsArray.append(message)
                            }

                            replyHandler(["names":dogsArray])
                        }
                    }
                })   
            }
        }
    }
}

我已经通过手动输入进行了测试 var dogsArray = [“狗1”,“狗2”,“狗3”] 结果是所有 3 个项目都回来了。我确实知道我应该得到 7 件元素,但只得到了第一个。非常奇怪,非常感谢任何帮助!

最佳答案

您的代码中似乎存在逻辑错误,请尝试将其更改为:

query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
if error == nil && objects!.count > 0 {
    var dogsArray = [String]() // moved this
    for object in objects! {
        if let message = object["dogName"] as? String {
            dogsArray.append(message)
        }
    }
    replyHandler(["names":dogsArray]) // and this
}

})

我将对replyHandler的调用以及dogsArray的创建移到了for循环之外,以便它累积所有狗的名字,然后调用replyHandler。

关于swift - iPhone AppDelegate 仅将数组的第一个对象返回给 Watch OS 2 iOS 9,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36064362/

相关文章:

ios - 当推送通知到达(未收到)设备上时调用委托(delegate)

swift - 使用桥接头创建 Pod

ios - NSLayoutAttribute topMargin 和 BottomMargin (边距约束)在 iOS 编程布局中不起作用

swift - SWIFT 中是否有通用链接的替代方案?

uikit - AutomaticAdjustsScrollViewInsets 在 iOS9 中不起作用

swift - 在 View Controller 中获取 applicationDidFinishLaunching 调用。解析尚未初始化

ios - Swift with Core Data 在我获取的字符串上得到一个 "Optional("")"?

ios - 在 Swift 中向 Int 添加千位分隔符

ios - 应用程序在 [__NSCFDictionary setObject :forKey:] in iOS 9 only 处崩溃

ios - 从 AppDelegate 获取数据到 iOS 中的 ViewController