2014-06-12 6 views
13

새로운 레코드를 추가 할 때 잠재적으로 많은 레코드를 가질 수있는 "테이블"이 있습니다. 일부 값의 계산에 이미 사용중인 레코드의 수를 알아야합니다. CloudKit 카운트 레코드

var query : CKQuery = CKQuery(recordType: "Stars", predicate: NSPredicate(format: "mass > 0")) 
    var request : CKQueryOperation = CKQueryOperation(query: query) 
    var starCount = 0 

    request.queryCompletionBlock = { 
     (cursor:CKQueryCursor!, error:NSError!) in 
     if error { 
      completionHandler(ECOResponse.error(error.description), starCount) 
     } else { 
      completionHandler(ECOResponse.ok(), starCount) 
     } 
    } 

    request.recordFetchedBlock = { 
     (record:CKRecord!) in 
     starCount += 1 
    } 

내가 queryCompletionBlock이 CKQueryCursor와 함께 카운트 또는 결과 배열을 준 좋겠지 만, 불행히도 그렇지 않습니다 : 내가 찾을 수있는 가장 가까운 것은이 같은 모든 항목을 요청하고 있습니다.

테이블의 행 수를 계산하는 다른 방법이 있습니까?

+0

Apple 개발자 포럼에서이 내용을 묻는 것이 좋습니다. 나는이 정보가 여전히 Apple 개발자 계약하에 비공개라고 생각합니다. –

+0

불행히도 CloudKit에 대한 논의가 많지 않습니다. –

답변

9

아니요, 아니요, 귀하의 쿼리를 준수하는 총 레코드 수를 얻을 수 없습니다. 또한 결과를 열거하면 대답이 잘못 될 수 있습니다. CloudKit에서 반환하는 레코드 수는 고정되어 있지 않습니다. CloudKit에는 반환 할 레코드 수를 결정하는 메커니즘이 있습니다. CKQueryOperation 객체에서이 값을 고정 된 수로 설정할 수 있습니다. 기본값은 다음과 같습니다

operation.resultsLimit = CKQueryOperationMaximumResults; 

이 속성의 문서화는 말한다 :

그 값을 사용하여, 서버는 가능한 한 많은 레코드를 반환 결과의 최적의 수를 제공하는 것을 목표로 제한을 선택 이러한 기록을받는 데 걸리는 시간을 최소화합니다. 그러나 고정 된 수의 결과를 처리하려는 경우이 속성 값을 적절하게 변경하십시오.

개수가이 고정 숫자와 같은 경우 쿼리보다 많은 레코드가 반환 될 수 있습니다.

+2

때로는이 상수를 사용할 때 (0이 됨) 오류가 발생합니다. malhal

+3

가끔 1000을 요청하고 실패 할 경우 커서를 사용하고 100의 제한을 사용하여 1000을 얻습니다. If 그런 다음 한 번에 1000 개를 모두 다시 시도하면 성공합니다! 따라서 서버는 캐시에 있어야하며 레코드가 캐시에 있으면 더 큰 제한을 허용해야합니다. – malhal