2015-02-02 2 views
0

로그인 화면이 있습니다. 사용자가 사용자 이름과 암호를 입력 한 다음 로그인을 클릭합니다. 그런 다음 클래스는 데이터베이스에 연결하여 데이터를로드하고 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 
} 

을 다음과 같이

부하 방법이다. 긴 질문에 사과드립니다. 다행히도 그것은 쉬운 대답을 가지고 있습니다.

답변

0

해당 메서드가 작업의 성공 상태를 반환하도록해서는 안됩니다. 대신 완료 값을 확인하는 코드를 완료 핸들러 내부로 이동해야합니다. 물론 별도의 메소드에 넣고 완료 ​​핸들러에서 호출 할 수 있습니다.

+0

저는 신속한 (그리고 또한 완료 핸들러의 개념에 새로운) 새로운 것입니다. performQuery의 완료 핸들러가 성공 결과를 처리합니까? 다른 것이 필요합니까? 조금 더 자세하게 설명해 주시겠습니까? – oyalhi

+0

실제로 완료 핸들러는 결과가 반환 될 때 performQuery에 의해 호출되는 코드 조각입니다. 이것은 메소드가 작업을 마친 후에 완료 핸들러가 호출되는 비동기 호출이기 때문에 가능합니다. 따라서 'loadSuccess = true'라는 줄은이 함수를 호출 한 후 현재 가지고있는 논리로 대체해야합니다. –

+0

감사합니다. 여러분의 도움과 약간의 독서로 이제 완성 처리자에 대해 더 많은 아이디어를 얻었습니다. 배경 코드를 포함한 모든 함수 코드가 끝나면 호출됩니다. 'func load (완료 : (결과 : Bool) -> void)'내가 한 일로 훌륭하게 작동합니다. 시스템에서 나를 허용 할 때 투표 할 것입니다. 고맙습니다. – oyalhi