2014-12-03 64 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