gpt4 book ai didi

swift - CloudKit(后台进程)和 UI 通信

转载 作者:行者123 更新时间:2023-11-30 10:19:09 27 4
gpt4 key购买 nike

我有一个登录屏幕。用户输入用户名和密码,然后单击登录。然后该类连接到数据库加载数据并返回 true 或 false。

但是,由于执行查询操作是在不同的线程中完成的,因此 Load 函数始终返回 false。但调试显示数据加载成功。

如果我从 UIController 中加载数据库,那么将数据库 block 放在下面就可以完美地工作:

    dispatch_async(dispatch_get_main_queue()) {

将 UI 与 Model 分离后,上述内容不再起作用。我如何进行后台数据库操作并知道它确实已完成?

在 View Controller 上我有以下代码:

            if mainPerson.isLoaded() != true {
let result = mainPerson.load()
NSLog("Person loaded from database result: \(result)")
}

总是返回 false。

加载方法如下:

func load() -> Bool {
var loadSuccess : Bool = false

let username = self.email

let predicate = NSPredicate(format: "email = %@", username)
let query = CKQuery(recordType: "PatikoyUsers", predicate: predicate)

// run the query
database.performQuery(query, inZoneWithID: nil, completionHandler: {
(records: [AnyObject]!, error: NSError!) in

if error != nil {
NSLog("There is an error fetching user: \(error)")
loadSuccess = false
} else {
// show record count and records
NSLog("User fetched, \(records.count) record(s) found")
for rec in records as [CKRecord] {
NSLog("Records = \(rec)")
}
if records.count == 0 {
loadSuccess = false
} else {
// user found, check password
NSLog("User found. Loading...")

self.record = records.first as CKRecord

self.name = self.record.objectForKey("name") as String
self.password = self.record.objectForKey("password") as String
self.verified = self.record.objectForKey("verified") as Bool

NSLog("User password is: \(self.password)")

self._isChanged = false
loadSuccess = true
}
}
})

self._isLoaded = loadSuccess
NSLog("ReservationPerson loading result: \(loadSuccess)")
return loadSuccess
}

总是返回 false。抱歉问了这么长的问题。希望它有一个简单的答案。

最佳答案

您不应该让该方法返回操作的成功状态。相反,您应该将检查成功值的代码移至完成处理程序内。当然,您可以将其放入单独的方法中,并从完成处理程序内部调用它。

关于swift - CloudKit(后台进程)和 UI 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28282993/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com