2016-04-26 17 views
4

CloudKitでレコードを取得するときにエラーを適切に処理する方法を知るには、何か助けが必要です。現在私は、クラウドに多数のレコードを保存するアプリケーションを持っており、起動時にそれらをロードします。私はCKReferenceを使ってレコードを参照していましたが、参照を保存するときはいつでもCKReferenceAction.DeleteSelfオプションを使用します。私が定期的に遭遇した問題は、参照されたレコードが削除されると、参照がそれ自身を削除するまでにかなりの時間がかかることがあるということです。これにより、私のアプリがもはや存在しないレコードのためにCKReferenceを取得したという状況が時々起こることがありました。私は手動でエラーハンドラにprint(error!)を挿入することによって、これがいつ起こるかを手動で調べることができます。私が知りたいのは、この特定のエラー、つまりif error.localizedDescription == ??? {を検出するコードを追加する方法です。ここ は私がフェッチのために使用している基本的なコードです:CloudKitエラーの区別

let fetch = CKFetchRecordsOperation(recordIDs: recordIDs) 
fetch.perRecordCompletionBlock = { (record:CKRecord?, recordID:CKRecordID?, error: NSError?) in 

    if error != nil { 

     // Error Line A (See below) 
     print("ERROR! : \(error!.localizedDescription)") 

     // Error Line B (See below) 
     print("ERROR: \(error!)") 

    } 

    else if let record = record { 

     // Record was found 
    } 
} 
if let database = self.privateDatabase { 
    fetch.database = database 
    fetch.start() 
} 

そして、それは存在しないレコードをフェッチしようとしたときに、ここでは、コンパイラ・ウィンドウに出力したエラーメッセージです:

は、

それはCKError 0x125e82820:というエラーラインB、中に上記a)のERROR! : Error fetching record <CKRecordID: 0x10025b290; dbbda7c3-adcc-4271-848f-6702160ea34f:(_defaultZone:__defaultOwner__)> from server: Record not found

B)ERROR: <CKError 0x125e82820: "Unknown Item" (11/2003); server message = "Record not found"; uuid = (removed); container ID = "(removed)">

、私は文の場合、この特定のエラーの種類を確認するために作成するためにこれを使用することができますか?私は本当にこの問題が発生したときにこの問題を適切に解決する方法を見つける助けを実際に使うことができました。私は、私のアプリのためのいくつかの読み込み構造を設定していると、それが見つかる必要があるレコードがあると思うが、それは私の読み込みプロセスをねじ込むことはできません。私が得ることができる助けに本当に感謝します、私はそれが簡単な解決策だと思いますが、明らかに私が見つけることができたものではありません。ありがとうございました!

UPDATE - @AaronBragerに

おかげで、私は、正しい解決策を見つけることができました。特定のエラーと一致させるためにエラーコードを確認し、ドメインがCKErrorであることを確認することができます。ここで私の作品解決策は以下のとおりです。

let fetch = CKFetchRecordsOperation(recordIDs: recordIDs) 
fetch.perRecordCompletionBlock = { (record:CKRecord?, recordID:CKRecordID?, error: NSError?) in 

    if error != nil { 

     if error!.code == CKErrorCode.UnknownItem.rawValue && error!.domain == CKErrorDomain { 

      // This works great! 

     } 

    } 

    else if let record = record { 

     // Record was found 

    } 
} 
if let database = self.publicDatabase { 
    fetch.database = database 
    fetch.start() 
} 
+0

'domain'と' code'変数を調べることで、エラーの原因を一意に特定できるはずです。同じ 'domain'と' code'、同じ問題です。また、 'localizedDescription'とは異なり、ユーザ間では変更されません。 –

+0

したがって、もし私が '' error.code == CKErrorCode.UnknownItem'のようないくつかのロジックを追加すれば、常に同じエラーを特定できるはずです。私はそれをテストします。 Thanks – Pierce

+0

エラーオブジェクトがCloudKitエラーではない可能性があるため、コード_とdomain_をテストする必要があります。 –

答えて

2

あなたは一意にdomaincode変数を調べて、エラーの原因を特定することができるはずです。同じdomaincode、同じ問題。 localizedDescriptionと異なり、ユーザー間では変更されません。

関連する問題