【问题标题】:Function returning value too fast函数返回值太快
【发布时间】:2016-05-01 20:36:21
【问题描述】:

我在一个项目中使用 CloudKit,我正在从云端加载数据以检查用户是否已经在云端,但是当我调用 loadUser() 函数时,代码已经返回了一个值 BEFORE实际值出现!代码如下:

override func viewDidLoad() {
    super.viewDidLoad()

    var shouldSaveUser = Bool()
    shouldSaveUser = loadUser()

    if shouldSaveUser == true {
        send2Cloud()
    } else {
        print("\nUSER ALREADY IN THE CLOUD\n")
    }
}

func loadUser() -> Bool {

    users = [CKRecord]()

    let publicData = CKContainer.defaultContainer().publicCloudDatabase
    let predicate = NSPredicate(format: "id == %@", id)
    let query = CKQuery(recordType: "User", predicate: predicate)

    publicData.performQuery(query, inZoneWithID: nil) { (results: [CKRecord]?, error: NSError?) -> Void in

        publicData.performQuery(query, inZoneWithID: nil) {
            records, error in
            if error != nil {
                print(error?.localizedDescription)
            }
        }

        if let users = results {
            self.users = users
            print("\nHow many users: \(self.users.count)\n")

            if self.users.count != 0 {
                self.aux = false
            } else {
                self.aux = true
            }
            print("\n\(self.aux)")
        }
    }
    print("\n\(self.aux)")
    return self.aux
}

现在,我有 0 个用户,所以 self.aux 应该等于 true,这只会发生在 loadUser() 返回错误值之后!这是控制台中出现的顺序:

false
USER ALREADY IN THE CLOUD
How many users: 0
true

应该是true,但当它更改为true 时已经太晚了! 有谁知道如何解决这个问题?非常感谢任何帮助!谢谢各位!

【问题讨论】:

  • 在处理异步操作时不能使用正常的返回值。使用完成处理程序而不是返回值设置 loadUser
  • 为什么你有两个电话给performQuery,一个在另一个里面?
  • @rmaddy 非常感谢!不知道那件事。你的回答真的很有帮助!!
  • @rmaddy 哦,这是一个错误,我已经在我的代码中去掉了它!

标签: ios cloudkit


【解决方案1】:

您的代码似乎在后台线程中运行 publicData.performQuery,并在完成后调用

  if error != nil {
     print(error?.localizedDescription)
                  }

所以块外publicData.performQuery之后的代码在返回结果之前运行。所以你应该把依赖于这个查询的代码放在if error != nil { //CODE HERE }

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2015-02-16
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多