我一直在ios 8测试版中使用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);
});
}
};
}
和调用this…
[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的响应。
这是我使用的。自我。容器为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];
}
在使用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
}