HandleWatchKitExtensionRequest 中的嵌套 PFQuery
Nested PFQuery's in HandleWatchKitExtensionRequest
我正在尝试将 2 个 PFQuery 嵌套在 HandleWatchKitExtensionRequest 中,以便我可以在回复中将数据传回我的 Watch Extension。在下面的代码中,第一个查询(对于匹配给定用户名的 PFUser)returns,但我无法将第二个(对于用户的人员列表)获取到 return。在同一个块中进行多个查询时,我缺少一些限制吗?这么长的 运行 请求可以 return 之前,我的后台任务是否超时?
*我编辑了我的代码,使 nameList 不是可选的,但仍然没有 return 值。虽然同一块(嵌套的 findObjectsInBackGroundBlocks)在我的 IOS 应用程序中执行并且 returns 完美。
延长后台任务的延迟时间没有帮助。
func application(application: UIApplication, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]?, reply: (([NSObject : AnyObject]!) -> Void)!) {
var dictionary = userInfo! as NSDictionary
if let currentUserName: AnyObject = dictionary.objectForKey("currentUserName") {
if let currentUserNameAsString = currentUserName as? String {
// Bogus task for keeping app going
var bogusTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler { () -> Void in
}
// End bogus task after 2 seconds
delay(2.0, closure: { () -> () in
UIApplication.sharedApplication().endBackgroundTask(bogusTask)
})
// look up current user logged in on phone from name passed from Watch
let query = PFUser.query()
query!.whereKey("username", equalTo: currentUserNameAsString)
query!.findObjectsInBackgroundWithBlock { (objects, error) -> Void in
if let user = objects?.first as? PFUser {
var testName: String?
var nameList: String = []
let query = PFQuery(className: Person.parseClassName())
query.whereKey("user", equalTo: user)
query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in
if let people = objects as? [Person] {
for person in people {
if let name = person.name {
nameList.append(name)
testName = nameList.first
}
}
}
testName = ("test")
}
let testDict = ["success" : testName!]
reply(testDict)
UIApplication.sharedApplication().endBackgroundTask(bogusTask) // End the bogusTask in case the work was faster than 2 seconds
}
}
}
}
}
// Utility function for delay
func delay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(),
closure
)
}
您似乎在嵌套查询之外调用 "reply(testDict)"。
由于查询是异步的,因此 "reply(testDict)" 可能在嵌套查询完成执行之前被调用。
我正在尝试将 2 个 PFQuery 嵌套在 HandleWatchKitExtensionRequest 中,以便我可以在回复中将数据传回我的 Watch Extension。在下面的代码中,第一个查询(对于匹配给定用户名的 PFUser)returns,但我无法将第二个(对于用户的人员列表)获取到 return。在同一个块中进行多个查询时,我缺少一些限制吗?这么长的 运行 请求可以 return 之前,我的后台任务是否超时?
*我编辑了我的代码,使 nameList 不是可选的,但仍然没有 return 值。虽然同一块(嵌套的 findObjectsInBackGroundBlocks)在我的 IOS 应用程序中执行并且 returns 完美。
延长后台任务的延迟时间没有帮助。
func application(application: UIApplication, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]?, reply: (([NSObject : AnyObject]!) -> Void)!) {
var dictionary = userInfo! as NSDictionary
if let currentUserName: AnyObject = dictionary.objectForKey("currentUserName") {
if let currentUserNameAsString = currentUserName as? String {
// Bogus task for keeping app going
var bogusTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler { () -> Void in
}
// End bogus task after 2 seconds
delay(2.0, closure: { () -> () in
UIApplication.sharedApplication().endBackgroundTask(bogusTask)
})
// look up current user logged in on phone from name passed from Watch
let query = PFUser.query()
query!.whereKey("username", equalTo: currentUserNameAsString)
query!.findObjectsInBackgroundWithBlock { (objects, error) -> Void in
if let user = objects?.first as? PFUser {
var testName: String?
var nameList: String = []
let query = PFQuery(className: Person.parseClassName())
query.whereKey("user", equalTo: user)
query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in
if let people = objects as? [Person] {
for person in people {
if let name = person.name {
nameList.append(name)
testName = nameList.first
}
}
}
testName = ("test")
}
let testDict = ["success" : testName!]
reply(testDict)
UIApplication.sharedApplication().endBackgroundTask(bogusTask) // End the bogusTask in case the work was faster than 2 seconds
}
}
}
}
}
// Utility function for delay
func delay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(),
closure
)
}
您似乎在嵌套查询之外调用 "reply(testDict)"。
由于查询是异步的,因此 "reply(testDict)" 可能在嵌套查询完成执行之前被调用。