iCloud 错误读取带有资产或资产列表的记录

iCloud error reading records with asset or asset lists

运行 Xcode El Capitan 下的 7.1.1 iPad 和 iOS 9.2.

运行 此代码针对一个非常简单的数据库...数据库包含定义为字符串的记录类型、引用 + 资产字段。

-(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];
            }
        }
   }];
}

它崩溃并显示此错误消息 [below] ... 等待它甚至没有进入 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 的稍微更简单的版本;同样的错误。这是该代码,包含在混合 objective 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)
}

好的,

我找到了修复;我不得不拼凑一个影子应用程序,让我可以通过 API 将图像上传到正确的数据库并通过云工具包仪表板。使用 API 上传资产后,上面的代码完美运行。问题似乎是 iCloudkit 仪表板中的 BUG;也许它是 El Capitan 功能或 Xcode 7.1.1 甚至 IOS 9.2.