我在所有方法上使用完成来确保控制执行流程。然而,在一个非常奇怪的例子中,这似乎并不适用。在TableViewController(TVC)中,当用户单击一行时,在didSelectRowAtIndexPath中,我正在检索用户信息,然后通过另一个方法检查条件。除了检索开始但在完成之前,检查方法发生。怎么会发生这种情况?我该如何解决?
这是didSelectRowAtIndexPath中的代码:
self.getFriendObjectDataFromBackend(self.notificationObject.from!, completion: { (result)->Void in
if(result.domain == "")
{
print(self.friendObject.name)
self.checkIfRequestAlreadyAccepted({ (result)->Void in
if(result == true)
{
...
}
})
}
})
for getFriendObjectDataFromBackend(..):
func getFriendObjectDataFromBackend(toUser:String, completion:(result:NSError) -> Void)
{
.....
}
和checkIfRequestAlreadyAccepted(..):
func checkIfRequestAlreadyAccepted(completion: (result:Bool) -> Void)
{
.....
}
在checkIfRequestAlreadyAccepted中触发错误,我依赖于使用getFriendObjectDataFromBackend设置的全局变量值。
提前感谢您的帮助。
更新:为getFriendObjectDataFromBackend添加了代码:
func getFriendObjectDataFromBackend(toUser:String, completion:(result:NSError) -> Void)
{
var errorFound:NSError = NSError(domain: "", code: 0, userInfo: nil)
let query: PFQuery = PFQuery(className: "_User")
query.whereKey("appUsername", equalTo: toUser)
query.findObjectsInBackgroundWithBlock {
(objects:[PFObject]?, error:NSError?) -> Void in
if(error == nil)
{
completion(result: errorFound)
self.friendObject.username = objects![0]["appUsername"] as? String
self.friendObject.name = objects![0]["appUsername"] as? String
}else{
errorFound = error!
completion(result: errorFound)
}
}
}
答案 0 :(得分:1)
在self.friendObject上设置全局值之前,您正在调用completion(result:errorFound)。你应该确保一切都已设置,然后调用完成处理程序。
if (error == nil)
{
self.friendObject.username = objects![0]["appUsername"] as? String
self.friendObject.name = objects![0]["appUsername"] as? String
completion(result: errorFound)
} else {
errorFound = error!
completion(result: errorFound)
}