在带有iOS 9.2的iPad上运行El Capitan下的Xcode 7.1.1。带资产或资产列表的iCloud错误读取记录
针对非常简单的数据库运行此代码...使用包含定义为字符串的记录类型的数据库,引用+资产字段。
-(void)slideLoader:(CKRecordID*)slideReference {
privateDB = [[CKContainer defaultContainer] privateCloudDatabase];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"presentationReference == %@", slideReference];
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Slides" predicate:predicate];
[privateDB performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error){
if(error) {
NSLog(@"Error: %@", error.localizedDescription);
}
if(results) {
for(CKRecord *record in results) {
NSString *blah = [NSString stringWithFormat:@"%@",record[@"Order"]];
CKRecordID *blahR = record.recordID;
[pickerNames addObject:blah];
[slidesReferenceID addObject:blahR];
}
}
}];
}
它崩溃,出现此错误消息[下文] ...并等待它甚至没有得到for循环;它在该行之前坠毁。现在,如果我进入iCloud仪表板并删除资产字段,它完美的工作......那么我在这里错过了什么?
<NSXPCConnection: 0x1557293e0> connection to service named com.apple.cloudd: Warning: Exception caught during decoding of received message, dropping incoming message.
Exception: Exception while decoding argument 0 (#2 of invocation):
<NSInvocation: 0x1555672e0>
return value: {v} void
target: {@} 0x0
selector: {:} handleOperationCompletion:forOperationWithID:
argument 2: {@} 0x0
argument 3: {@} 0x0
Exception: value for key 'NS.keys' was of unexpected class 'CKRecordID'. Allowed classes are '{(
NSURL,
NSString,
NSDate,
NSData,
NSNumber,
NSDictionary,
NSError,
NSArray
)}'.
尝试了一个稍微更简单的版本与Swift 2.0;同样的错误。这里是作为混合目标C/Swift 2.0构建包含的代码。 Swift文件被称为“iCloudMethods.swift”。
import Foundation
import CloudKit
@objc class iCloudMethods: NSObject {
func slideLoader(slideReference: CKRecordID) {
let container = CKContainer.defaultContainer()
let privateDB = container.privateCloudDatabase
let predicate = NSPredicate(format: "presentationReference == %@", slideReference)
let query = CKQuery(recordType: "Slides", predicate: predicate)
privateDB.performQuery(query, inZoneWithID: nil) { (results, error) -> Void in
if error != nil {
print(error)
}
if((results) != nil) {
for result in results! {
print(result["Order"])
}
}
}
}
}
与语句调用...
#import "projectName-Swift.h"
iCloudMethods *iCloudMethod = [[iCloudMethods alloc] init];
[iCloudMethod slideLoader:presentationReferenceID[row]];
可悲的是仍然崩溃,同样的错误消息时,我的资产添加到仪表盘,完美的作品,如果我离开他们空的?为确保记录的定义是这样的......
即使试图用一个基本的查询操作要做到这一点,仍然失败。
func slideLoaderV2(slideReference: CKRecordID) {
let container = CKContainer.defaultContainer()
let privateDB = container.privateCloudDatabase
let predicate = NSPredicate(format: "presentationReference == %@", slideReference)
let query = CKQuery(recordType: "Slides", predicate: predicate)
let operation = CKQueryOperation(query: query)
operation.recordFetchedBlock = { (record) in
print(record["Order"])
}
operation.queryCompletionBlock = { [unowned self] (cursor, error) in
dispatch_async(dispatch_get_main_queue()) {
if error == nil {
print("ok")
} else {
print(error!.localizedDescription)
}
}
}
_ = privateDB.addOperation(operation)
}