로그인 화면이 있습니다. 사용자가 사용자 이름과 암호를 입력 한 다음 로그인을 클릭합니다. 그런 다음 클래스는 데이터베이스에 연결하여 데이터를로드하고 true 또는 false를 반환합니다.CloudKit (백그라운드 프로세스) 및 UI 통신
그러나 쿼리 실행 작업이 다른 스레드에서 수행되기 때문에로드 함수는 항상 false를 반환합니다. 그러나 디버깅은 성공적인 데이터로드를 보여줍니다.
나는 다음의 데이터베이스 블록을 넣어, 다음 UIController 내에서 데이터베이스로드를 수행한다면 것은 아름답게 일하는 :
dispatch_async(dispatch_get_main_queue()) {
내가 모델에서 UI를 분리 한 후, 위가 더 이상 작동하지 않습니다. 백그라운드 데이터베이스 작업에 대해 어떻게 생각하고 그것이 실제로 끝났음을 알 수 있습니까? 항상 false를 반환
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
}
을 다음과 같이
부하 방법이다. 긴 질문에 사과드립니다. 다행히도 그것은 쉬운 대답을 가지고 있습니다.
저는 신속한 (그리고 또한 완료 핸들러의 개념에 새로운) 새로운 것입니다. performQuery의 완료 핸들러가 성공 결과를 처리합니까? 다른 것이 필요합니까? 조금 더 자세하게 설명해 주시겠습니까? – oyalhi
실제로 완료 핸들러는 결과가 반환 될 때 performQuery에 의해 호출되는 코드 조각입니다. 이것은 메소드가 작업을 마친 후에 완료 핸들러가 호출되는 비동기 호출이기 때문에 가능합니다. 따라서 'loadSuccess = true'라는 줄은이 함수를 호출 한 후 현재 가지고있는 논리로 대체해야합니다. –
감사합니다. 여러분의 도움과 약간의 독서로 이제 완성 처리자에 대해 더 많은 아이디어를 얻었습니다. 배경 코드를 포함한 모든 함수 코드가 끝나면 호출됩니다. 'func load (완료 : (결과 : Bool) -> void)'내가 한 일로 훌륭하게 작동합니다. 시스템에서 나를 허용 할 때 투표 할 것입니다. 고맙습니다. – oyalhi