2015-12-21 33 views
0

在带有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]]; 

可悲的是仍然崩溃,同样的错误消息时,我的资产添加到仪表盘,完美的作品,如果我离开他们空的?为确保记录的定义是这样的......

enter image description here

即使试图用一个基本的查询操作要做到这一点,仍然失败。

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) 
} 

回答

0

OK,

我发现修复;我不得不拼凑一个影子应用程序,让我通过API将图像上传到正确的数据库并通过云套件仪表板。使用API​​上传资产后,上面的代码完美地工作。它似乎是iCloudkit DASHBOARD中的一个BUG;也许它是一个El Capitan特性或Xcode 7.1.1甚至IOS 9.2。