3

我一直在 ios 8 beta 中使用 icloud,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 的回应。

4

2 回答 2

1

这是我正在使用的。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];
}
于 2014-07-22T16:09:52.177 回答
1

在您可以使用该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
}
于 2016-05-01T11:58:34.480 回答