CRUD 機能を備えた単純な連絡先ディレクトリを作成していますが、編集機能をオフラインで使用したいと考えています。連絡先のデータベースは、Parse.com バックエンドに保存されます。これは Parse キャッシュ機能を使用して可能でしょうか? それとも Core Data を使用する方がよいでしょうか?
3 に答える
いいえ、できません。Parse は、クエリの結果を単純にキャッシュします。これは非常に制限的であり、すべての PFObject をキャッシュすることと同じではありません。たとえば、すべての「連絡先」PFObject に対してクエリを実行したとします。キャッシュでできる唯一のことは、まったく同じクエリを後でもう一度実行することです (そしてまったく同じ結果を取得します)。そのキャッシュされたデータのサブセットに対してクエリを実行することさえできませんでした。
もう 1 つの問題は、キャッシュされたオブジェクトが、ユーザーが PFObject に加えた変更によって更新されないことです。たとえば、ユーザーが連絡先をオフラインで編集していてsaveEventually
、可能であればそれらの変更を Parse に保存するためにコードが呼び出しているとします。キャッシュされたクエリ結果を取得すると、ユーザーの変更は PFObjects に反映されません。同じことが、削除および追加された PFObjects にも当てはまります。これにより、オフラインでの使用がひどくなります。これは、この件に触れている Parse フォーラムのスレッドです。
私は、Parse 開発者が、将来のある時点で Parse オブジェクトのキャッシングが改善されると言及しているのを見てきました。ただし、この機能はまだ存在しておらず、いつ登場するかはわかりません。それまでの間、オフラインでの使用をサポートしたい場合は、Core Data またはその他のローカル ストアを使用する必要があります。FTASync (私は一度も使用したことがありません) は、Parse オブジェクトを Core Data と同期するように設計されています。
https://github.com/itsniper/FTASync
独自のコードを記述して、2 つのデータ セットを同期することもできます。
Parse iOS/OSX SDK は、ネットワークが利用できない場合でも、PFObject の保存と取得に使用できるローカル データストアを提供します。この機能を有効にするには、libsqlite3.dylib を追加し、setApplicationId:clientKey: を呼び出す前に [Parse enableLocalDatastore] を呼び出します。
パースのドキュメントに記載されているように:
固定することで、PFObject をローカル データストアに格納できます。PFObject の固定は、保存と同様に再帰的であるため、固定しているオブジェクトが指すオブジェクトもすべて固定されます。オブジェクトが固定されると、新しいデータをフェッチまたは保存してオブジェクトを更新するたびに、ローカル データストア内のコピーが自動的に更新されます。まったく心配する必要はありません。
PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"]; gameScore[@"score"] = 1337; gameScore[@"playerName"] = @"Sean Plott"; gameScore[@"cheatMode"] = @NO; [gameScore pinInBackground];
オブジェクトが複数ある場合は、pinAllInBackground 簡易メソッドを使用して一度にすべてを固定できます。
[PFObject pinAllInBackground:listOfObjects];
ローカル データストアからのオブジェクトの取得は、ネットワーク経由での取得と同じように機能します。唯一の違いは、fromLocalDatastore メソッドを呼び出して、PFQuery にその結果を探す場所を伝えることです。
PFQuery *query = [PFQuery queryWithClassName:@"GameScore"]; [query fromLocalDatastore]; [[query getObjectInBackgroundWithId:@"xWMyZ4YE"] continueWithBlock:^id(BFTask *task) { if (task.error) { // Something went wrong. return task; } // task.result will be your game score return task; }];
どの PFQuery も、ネットワークと同様にローカル データストアで使用できます。結果には、クエリに一致する固定したオブジェクトが含まれます。オブジェクトに加えた未保存の変更は、クエリを評価するときに考慮されます。したがって、この特定のクエリに対してサーバーから返されなかった場合でも、一致するローカル オブジェクトを見つけることができます。
PFQuery *query = [PFQuery queryWithClassName:@"GameScore"]; [query fromLocalDatastore]; [query whereKey:@"playerName" equalTo:@"Joe Bob"]; [[query findObjectsInBackground] continueWithBlock:^id(BFTask *task) { if (task.error) { NSLog(@"Error: %@", task.error); return task; } NSLog(@"Retrieved %d", task.result.count); return task; }];
オブジェクトの処理が完了し、ローカル データストアに存在する必要がなくなった場合は、単純に固定を解除できます。
[gameScore unpinInBackground];
一度に複数のオブジェクトの固定を解除する方法もあります。
[PFObject unpinAllInBackground:listOfObjects];
Parse のローカル データストアの使用に関する詳細については、parse の Web サイトで iOS/OSX 用に提供されているローカル データストアのドキュメントを確認してください。
いいえ、できません。ほぼ同じではありません。https://github.com/itsniper/FTASyncをお勧めします。