CKQuery from private zone returns only first 100 CKRecords from in CloudKit

前端 未结 5 1873
遇见更好的自我
遇见更好的自我 2020-12-03 08:19

Is there any limit to the result of a query to Cloudkit private default zone? I have no clue why I only receive first 100 records with the following query:<

5条回答
  •  暖寄归人
    2020-12-03 08:54

    I use this code for my project to fetch all record from a record type, it's in objective c. I use "Entry" as desiredKeys.

    + (void)fetchRecordsWithType:(NSString *)recordType
               completionHandler:(void (^)(NSArray *records, NSError *error))completionHandler {
    
        NSPredicate *truePredicate = [NSPredicate predicateWithValue:YES];
    
        CKQuery *query = [[CKQuery alloc] initWithRecordType:recordType
                                                   predicate:truePredicate];
    
        CKQueryOperation *queryOperation = [[CKQueryOperation alloc] initWithQuery:query];
        queryOperation.desiredKeys = @[@"Entry"];
    
        NSMutableArray *results = [NSMutableArray new];
    
        queryOperation.recordFetchedBlock = ^(CKRecord *record) {
    
            [results addObject:record]; };
    
        queryOperation.queryCompletionBlock = ^(CKQueryCursor *cursor, NSError *error) {
    
            [self retrieveNextBatchOfQueryFromCursor:cursor
                                             results:results
                                               error:error
                                   completionHandler:completionHandler]; };
    
        [[self CloudKitContainer].privateCloudDatabase addOperation:queryOperation]; }
    
    
    + (void)retrieveNextBatchOfQueryFromCursor:(CKQueryCursor *)cursor
                                       results:(NSMutableArray *)results
                                         error:(NSError *)error
                             completionHandler:(void (^)(NSArray *records, NSError *error))completionHandler {
    
        // CloudKit apparently has query limit
    
        if (cursor != nil
            && !error) {
    
            CKQueryOperation *nextOperation = [[CKQueryOperation alloc] initWithCursor:cursor];
    
            nextOperation.recordFetchedBlock = ^(CKRecord *record) {
    
                [results addObject:record]; };
    
            nextOperation.queryCompletionBlock = ^(CKQueryCursor *cursor, NSError *error) {
    
                [self retrieveNextBatchOfQueryFromCursor:cursor
                                                 results:results
                                                   error:error
                                       completionHandler:completionHandler]; };
    
            [[self CloudKitContainer].privateCloudDatabase addOperation:nextOperation]; }
    
        else {
    
            dispatch_async(dispatch_get_main_queue(), ^(void){
    
                completionHandler(results, error); }); }}
    

提交回复
热议问题