Любой рабочий пример кода для CKDiscoverAllContactsOperation для IOS8 beta CloudKit?

Я играл с icloud в бета-версии iOS 8, и пример проекта CloudKitAtlasAnIntroductiontoCloudKit оказался очень полезным. https://developer.apple.com/library/prerelease/ios/samplecode/CloudAtlas/Introduction/Intro.html

Но я хотел использовать класс CKDiscoverAllContactsOperation, и я нигде не могу найти пример кода для него, а онлайн-документация не очень полезна. https://developer.apple.com/library/prerelease/ios/documentation/CloudKit/Reference/CKDiscoverAllContactsOperation_class/index.html

Если кому-то удалось успешно использовать CKDiscoverAllContactsOperation, не могли бы вы указать мне правильное направление или показать рабочий пример того, как его следует называть?

Я пробовал это, чтобы увидеть, смогу ли я получить ответ от iCloud, но ничего:

- (void)queryForRecordsOtherUsersInAddressBookcompletionHandler:(void (^)(NSArray *records))completionHandler {

CKDiscoverAllContactsOperation *discoverAllContactsOperation= [[CKDiscoverAllContactsOperation alloc] init];
[discoverAllContactsOperation setContainer:_container];

NSMutableArray *results = [[NSMutableArray alloc] init];


discoverAllContactsOperation.discoverAllContactsCompletionBlock = ^(NSArray *userInfos, NSError *operationError) {
    [results addObjectsFromArray:userInfos];
};


discoverAllContactsOperation.discoverAllContactsCompletionBlock=^(NSArray *userInfos, NSError *operationError){
    if (operationError) {
        // In your app, handle this error with such perfection that your users will never realize an error occurred.
        NSLog(@"An error occured in %@: %@", NSStringFromSelector(_cmd), operationError);
        abort();
    } else {
        dispatch_async(dispatch_get_main_queue(), ^(void){
            completionHandler(results);
        });

    }
};


}

и звоню с этим...

 [self.cloudManager queryForRecordsOtherUsersInAddressBookcompletionHandler:^(NSArray *records ) {
                if (records.count==0){
                    NSLog(@"Login name not found");
                    return;
                }
                //self.results= records;
                //_loggedInRecord = self.results[0];
                //NSLog(@"%@,%@",_loggedInRecord[@"lastName"],_loggedInRecord[@"firstName"]);
               // [self performSegueWithIdentifier:@"loggedInSegue" sender:self ];

            }];

Я знаю, что код ничего не должен делать. Опять же, я просто искал ответ от iCloud.


person luca992    schedule 09.07.2014    source источник


Ответы (2)


Вот что я использую. self.container — это набор CKContainer с [CKContainer defaultContainer] в init.

  -(void)queryForAllUsers: (void (^)(NSArray *records))completionHandler {

    CKDiscoverAllContactsOperation *op = [[CKDiscoverAllContactsOperation alloc] init];

    [op setUsesBackgroundSession:YES];
    op.queuePriority = NSOperationQueuePriorityNormal;

    [op setDiscoverAllContactsCompletionBlock:^(NSArray *userInfos, NSError *error) {

        if (error) {
            NSLog(@"An error occured in %@: %@", NSStringFromSelector(_cmd), error);
            //abort();
        } else {

     //       NSLog(@"Number of records in userInfos is: %ld", (unsigned long)[userInfos count]);
            dispatch_async(dispatch_get_main_queue(), ^(void){
                completionHandler(userInfos);
            });
        }
    }];
    [self.container addOperation:op];
}
person Bill Johnson    schedule 22.07.2014
comment
все равно не работало. если вы найдете что-нибудь по этому поводу, пожалуйста, сообщите мне. - person Abha; 15.09.2014
comment
Обязательно добавьте свою операцию в очередь, например: [self.container addOperation:op]; - person Bill Johnson; 16.09.2014
comment
@BillJohnson Я получаю ноль в userInfos. Есть идеи, что может пойти не так? Я использую тот же код, который вы разместили выше. - person iOS_MIB; 27.04.2016

Прежде чем вы сможете использовать операцию CKDiscoverAllContactsOperation, вам сначала нужно запросить разрешение.

Пожалуйста, используйте метод requestApplicationPermission:completion:

func discoverAllContacts() {

    let container = CKContainer.defaultContainer()

    //Request for user permission
    container.requestApplicationPermission([.UserDiscoverability]) { [weak self] status, error in

        switch status {
        case .Granted where error == nil:
            let operation = self?.discoverAllContactsOperation { usersInfo in
                //do something here
            }

            if let operationExists = operation {

                //Assuming there is a NSOperationQueue property called operationQueue
                self?.operationQueue.addOperation(operationExists)

            }

        default:
            break
        }
    }
}

func discoverAllContactsOperation(completionHandler: ([CKDiscoveredUserInfo]?) -> ()) -> NSOperation {

    let operation = CKDiscoverAllContactsOperation()

    operation.discoverAllContactsCompletionBlock = { usersInfo, error in

        if error == nil {
            print("Discoverd all contacts = \(usersInfo)")
            completionHandler(usersInfo)
        }
        else {
            print("Discoverd all contacts error = \(error)")
            completionHandler(nil)
        }

    }

    return operation
}
person user1046037    schedule 01.05.2016