我刚刚从 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/