Swift 2.0 - 编程逻辑与语言不同吗?

时间:2015-11-20 08:23:07

标签: swift2 xcode7

我是Swift 2.0编程的新手。我做了一个与Parse集成的应用程序。以下是我的代码片段

 private func isIdNotFound() ->Bool{

    var notFound = true

    let query = PFQuery(className: "Customer")
    query.whereKey("customerId", equalTo: self.id)
    query.findObjectsInBackgroundWithBlock{
        (objects : [PFObject]?, error: NSError?) -> Void in
        if error == nil &&  objects != nil{
            print(objects)
            notFound = false
            print(notFound)
        }
    }
    print(notFound)
    return notFound
}

控制台:

true
<Customer: 0x7feccbf07ef0, objectId: AiPH5pNgum, localId: (null)> {
    customerId = wilson93;
    email = 123;
    password = 123;
    }])
false

为什么打印true然后只运行逻辑并打印false。至于其他语言如Java,它应该打印两次错误。

1 个答案:

答案 0 :(得分:2)

如评论中所述,您的代码为query.findObjectsInBackgroundWithBlock:。在这里,Background是关键字。因为您是异步搜索,因此不一定按照代码的顺序进行搜索,所以print(notFound)第二个实例在块中的实例之前执行。 / p>

你可以说,因为,如果大声读出,两个print语句就在彼此旁边(不包括大括号),但notFound不会连续打印两次。 objects在第一个(代码中的第二个实例)打印语句之后打印,但之前打印另一个。

var notFound = true

query.findObjectsInBackgroundWithBlock{
    (objects : [PFObject]?, error: NSError?) -> Void in
    if error == nil &&  objects != nil{
        print(objects) //this comes second
        notFound = false
        print(notFound) //then this comes last
    }
}
print(notFound) //this runs first

请参阅documentation for PFQuery here。它说, in italics ,搜索是异步执行的。

来自doc:

  

异步查找对象 并使用结果调用给定的块。

- (void)findObjectsInBackgroundWithBlock:(nullable PFQueryArrayResultBlock)block

参数

IIRC,这意味着搜索是在另一个线程上运行的 如果我错了,@社区会纠正我。