Swift - 方法无序执行

时间:2016-01-28 21:12:47

标签: ios swift parse-platform

我在所有方法上使用完成来确保控制执行流程。然而,在一个非常奇怪的例子中,这似乎并不适用。在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)
             }
        }
    }

1 个答案:

答案 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)
}