【发布时间】:2015-09-07 15:37:52
【问题描述】:
我正在尝试通过 Application Context 方法通过 Watch Connectivity 使用后台传输从 iPhone -> Watch 传递数据。
iPhoneTableViewController
private func configureWCSession() {
session?.delegate = self;
session?.activateSession()
print("Configured WC Session")
}
func getParsePassData () {
let gmtTime = NSDate()
// Query Parse
let query = PFQuery(className: "data")
query.whereKey("dateGame", greaterThanOrEqualTo: gmtTime)
query.findObjectsInBackgroundWithBlock { (objects:[AnyObject]?, error:NSError?) -> Void in
if error == nil
{
if let objectsFromParse = objects as? [PFObject]{
for MatchupObject in objectsFromParse
{
let matchupDict = ["matchupSaved" : MatchupObject]
do {
try self.session?.updateApplicationContext(matchupDict)
print("getParsePassData iPhone")
} catch {
print("error")
}
}
}
}
}
}
我在日志中得到了两次error printed (我在 Parse 中有两个 matchups,所以它可能知道有两个对象,这就是为什么它也会抛出两个错误?) em>:
Configured WC Session
error
error
所以我什至还没有达到我可以在 Watch 应用程序中 print 它以查看 matchups 是否正确传递的地步。
观看InterfaceController:
func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
let matchupWatch = applicationContext["matchupSaved"] as? String
print("Matchups: %@", matchupWatch)
}
有什么想法吗?将发布您需要的任何额外代码。谢谢!
编辑 1:
根据 EridB 的回答,我尝试将编码 添加到 getParsePassData
func getParsePassData () {
let gmtTime = NSDate()
// Query Parse
let query = PFQuery(className: "data")
query.whereKey("dateGame", greaterThanOrEqualTo: gmtTime)
query.findObjectsInBackgroundWithBlock { (objects:[AnyObject]?, error:NSError?) -> Void in
if error == nil
{
if let objectsFromParse = objects as? [PFObject]{
for MatchupObject in objectsFromParse
{
let data = NSKeyedArchiver.archivedDataWithRootObject(MatchupObject)
let matchupDict = ["matchupSaved" : data]
do {
try self.session?.updateApplicationContext(matchupDict)
print("getParsePassData iPhone")
} catch {
print("error")
}
}
}
}
}
}
但是在日志中得到这个:
-[PFObject encodeWithCoder:]: unrecognized selector sent to instance 0x7fbe80d43f30
*** -[NSKeyedArchiver dealloc]: warning: NSKeyedArchiver deallocated without having had -finishEncoding called on it.
编辑 2:
根据 EridB 的回答,我也尝试将函数粘贴到我的代码中:
func sendObjectToWatch(object: NSObject) {
//Archiving
let data = NSKeyedArchiver.archivedDataWithRootObject(MatchupObject)
//Putting it in the dictionary
let matchupDict = ["matchupSaved" : data]
//Send the matchupDict via WCSession
self.session?.updateApplicationContext(matchupDict)
}
但是在函数的第一行得到这个错误:
“使用未解析的标识符MatchupObject”
我确定我一定没有理解如何正确使用 EridB 的答案。
编辑 3:
NSCoder 方法:
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
//super.init(coder: aDecoder)
configureWCSession()
// Configure the PFQueryTableView
self.parseClassName = "data"
self.textKey = "matchup"
self.pullToRefreshEnabled = true
self.paginationEnabled = false
}
【问题讨论】:
-
@Lamar 数据实际上并没有通过,我有一些小东西,我假设一定不对?
-
其他 WCSession API 是否工作(sendMessage、transferFile)?如果您只发送字符串,applicationContext 是否有效?让 applicationDict = ["matchUp" : "test"]
-
@ccjensen 是的,应用程序上下文对我有用,但我只是没有设置完全适合它工作的东西。而且我不确定我的代码的哪一部分是错误的。
-
matchUp 变量是什么对象类型?我猜它不是property list types 之一
-
是的,如果它是一个字符串,那么应该可以正常工作(尽管您可能应该将 TableViewController
func sendMatchup(matchUp: AnyObject)中的此方法更改为func sendMatchup(matchUp: String)。不幸的是,这让我们无法弄清楚原因事情不适合你。你有没有机会提供一个完整的示例项目?
标签: xcode swift parse-platform watchkit watchos-2