2014-12-03 67 views
3

我有一个iOS应用程序我正在使用Cloud Kit。基本上发生的是,当CKRecord被删除时,首先创建CKRecord的人应该会收到通知。为此,我正在创建订阅。Cloud Kit订阅CKRecord创建

一切似乎都是按照它应该的方式工作,除非它看起来像每当你创建一条记录时,你实际上都订阅了所有的记录。那么创建该记录的人无关紧要,因为您会收到通知。我认为我得到的NSPredicate错误,也许有人可以帮忙?这里是我有相关的代码:

NSString *attributeName = @"recordID"; 
    NSString *attributeValue = newRecord.recordID.recordName; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ like %@", attributeName, attributeValue]; 
    CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:@"Photo" predicate:predicate options:CKSubscriptionOptionsFiresOnRecordDeletion]; 

现在我得到了的recordId与attributeName实际上应该像recordID.recordName,但我想,也和它没有工作。我仍然得到相同的结果。我不知道这样做的最佳方式,但基本上我想要的是当该记录已被删除时,订阅仅会触发CKRecord的创建者。

Note that first I create the CKRecord , then upload it to CloudKit. Then in the callback method, I am subscribing and doing the code above.

回答

2

当您查询recordID字段时,attributeValue也应该是recordID而不是字符串。那么对于与attributeName过滤器,你不应该使用%@但%K

NSString *attributeName = @"recordID"; 
    CKRecordID *attributeValue = [[CKRecordID alloc] initWithName:newRecord.recordID.recordName]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", attributeName, attributeValue]; 
    CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:@"Photo" predicate:predicate options:CKSubscriptionOptionsFiresOnRecordDeletion]; 

但是,当你有你的逻辑就是这样,你将为创建的每个记录订阅。你可以通过一个通用订阅解决这个问题。只需为元数据字段creatorUserRecordID添加条件即可。然后您必须首先获取iCloud帐户中已冻结的recordID,然后创建如下所示的订阅:

在容器上执行fetchUserRecordIDWithCompletionHandler。在回调中,您将收到一个recordID。只是用它来创建过滤器

[[CKContainer defaultContainer] fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) { 
      NSString *attributeName = @"creatorUserRecordID"; 
      NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", attributeName, recordID]; 
      CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:@"Photo" predicate:predicate options:CKSubscriptionOptionsFiresOnRecordDeletion]; 
      // ... rest of your code 
     }] 

只是扩展该代码与错误处理

+0

嗨埃德温,我只是想你的第一个解决方案,但它看起来像我仍然订阅的一切再次...我做两个不同的iTunes/iCloud帐户在两个不同的iPhone上的记录。在每部手机上上传了一份差异记录。当两个人都使用一部电话被删除时,另一个人收到了两个通知。我会尝试你的第二种方法,但我想知道为什么第一个不工作? – 2014-12-04 15:08:59

+0

我也试过:NSString * attributeName = @“recordID”; CKRecordID * attributeValue = newRecord.recordID; NSPredicate * predicate = [NSPredicate predicateWithFormat:@“%K like%@”,attributeName,attributeValue];它不起作用 – 2014-12-04 15:16:47

+0

我还注意到,在CloudKit Dashboard上,当我订阅类型时,我只能看到一个带有RecordType:Photo,Trigger:Remove,Criteria :(空白)......我认为会有订阅对于那里创建的每个记录,recordID的条件必须是一些长字符串? – 2014-12-04 15:21:08