CloudKit(后台进程)和UI通信
CloudKit (a background process) and UI communication
我有一个登录屏幕。用户输入用户名和密码,然后单击登录。然后 class 连接到数据库加载数据和 returns true 或 false。
但是,因为执行查询操作是在不同的线程中完成的,所以Load函数总是returns false。但是调试显示数据加载成功。
如果我从 UIController 中进行数据库加载,那么将数据库块放在下面就可以很好地工作:
dispatch_async(dispatch_get_main_queue()) {
在我将 UI 从模型中分离出来后,以上不再有效。
我如何进行后台数据库操作并知道它确实已完成?
在视图控制器上我有这个代码:
if mainPerson.isLoaded() != true {
let result = mainPerson.load()
NSLog("Person loaded from database result: \(result)")
}
这总是 returns 错误。
加载方法如下:
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
}
这总是 returns 错误。很抱歉这个问题很长。希望它有一个简单的答案。
你不应该让那个方法return成为操作的成功状态。相反,您应该将检查成功值的代码移动到完成处理程序内部。当然你可以把它放在一个单独的方法中并从你的完成处理程序中调用它。
我有一个登录屏幕。用户输入用户名和密码,然后单击登录。然后 class 连接到数据库加载数据和 returns true 或 false。
但是,因为执行查询操作是在不同的线程中完成的,所以Load函数总是returns false。但是调试显示数据加载成功。
如果我从 UIController 中进行数据库加载,那么将数据库块放在下面就可以很好地工作:
dispatch_async(dispatch_get_main_queue()) {
在我将 UI 从模型中分离出来后,以上不再有效。 我如何进行后台数据库操作并知道它确实已完成?
在视图控制器上我有这个代码:
if mainPerson.isLoaded() != true {
let result = mainPerson.load()
NSLog("Person loaded from database result: \(result)")
}
这总是 returns 错误。
加载方法如下:
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
}
这总是 returns 错误。很抱歉这个问题很长。希望它有一个简单的答案。
你不应该让那个方法return成为操作的成功状态。相反,您应该将检查成功值的代码移动到完成处理程序内部。当然你可以把它放在一个单独的方法中并从你的完成处理程序中调用它。