5

ネットワーク接続なしで保存しようとすると、PFObjectローカルに正常に保存され、ネットワーク接続でアプリを再起動するたびに、オブジェクトがサーバーに保存されるように見えますが、すべてのパラメーターが空です。

次の手順を実行しています。まずPFObject、異なる値で を作成し、 を呼び出しますsaveEventually。これらの手順の間、インターネットに接続していない (機内モードがオンになっている) ため、サーバーに保存できず、ローカルに保存されました。

PFObject *contact = [PFObject objectWithClassName:@"Contact"];
[contact setObject:[PFUser currentUser] forKey:kRelatedToUserKey];
[contact setObject:self.firstname forKey:kFirstnameKey];
[contact setObject:self.lastname forKey:kLastnameKey];

[contact saveEventually];

今、私はアプリを閉じて、もう一度起動しています。そのように連絡先を読み込んでいます。名、姓などのすべての正しい値を含む正しいオブジェクトを取得しています。

PFQuery *postQuery = [PFQuery queryWithClassName:@"Contact"];
[postQuery whereKey:@"related_to_user" equalTo:[PFUser currentUser]];
[postQuery fromLocalDatastore];
[postQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (!error) {
        // here I get back the correct object from local storage, with all values
    }
}];

機内モードをオフにすると、オブジェクトをサーバーに保存しようとしますが、バックエンドで確認できるのは、値のない objectId だけです。

ここに画像の説明を入力

一方、ローカルに保存されたオブジェクトにはすべて正しい値があります。

4

4 に答える 4

1

それで、あなたは正確に何をしようとしていますか?読み方は次のとおりです。

「連絡先」クラスを照会し、それを照会して ID でオブジェクトを見つけたら ([ PFObject *contact] で何もしないオブジェクト) PFObject、完全に異なるクラスを作成しますか?? 単に投稿したいだけなら、それをすべて回避できますPFObjectが、質問に関係のない他のコードを省略したのではないでしょうか? でも大丈夫。あなたの質問に答えるためにsaveEventuallyローカル データ ストアと連携して動作するため、問題はないはずです。ご覧のとおり、呼び出されますが、objectID のように値が保存されません。objectID は自律的に作成されるため、保存され、他には何もありません。私は文字通り、可能な限りあらゆる方法でエラーを複製しようとしましたが、できません。それはあなたの値であり、nil を返しています。マクロ (キーの設定のように見えます)、エミュレートされた機内モードなども使用しました。確認するには、ピン留めされたオブジェクトをクエリして、返されるものを確認します。さらに、コールバックを実行するときに、if ステートメントを含めるか、それぞれを明示的に定義する switch ケースを含めることをお勧めします。

{
    if (succeeded) {
         debt.parseID = newDebt.objectId;
    }];
}];

さらに、saveEventually の重要な要素は、アプリが終了する前に完了せず、オブジェクトがまだメモリ内にある場合は再試行するため、重要なタスクを成功ブロックに入れることには注意してください。メモリ内にない場合、次の実行時に再試行されますが成功ブロックはありません。

プロパティ値 (self.contact | self.mount | self.incomingDebt) をトラブルシューティングします。これらをどのように定義していますか?


私たちは元の投稿から長い道のりを歩んできましsaveEventually.

Parse に現在アクセスできない場合でも、将来の不特定の時点でこのオブジェクトをサーバーに保存します。

の主な目的saveEventually:

これは、ネットワーク接続が安定していない可能性があり、保存がいつ完了したかを知る必要がない場合に使用します

送信待ちのデータが 10MB を超える場合は、接続が再確立され、キューに入れられたオブジェクトが保存されるまで、 への後続の呼び出しによって古い保存が静かに破棄されます。

これが呼び出されるタイミングを制御することはできません。さらに、保存すると、正常にアップロードされるまで最終的にデータがローカル ディスクにキャッシュされるため、同じオブジェクトをピン留めすることは冗長です。最終的に保存することは、考えてみれば、それ自体がローカル データストアであり、インターネットが利用可能になるまでローカル ディスクに保存されます (ローカル データストア)

これを回避する方法は 2 つあります。ローカル データストアは、ユーザーが単純なワンライナー コードで NSFRC を回避できるようにするコア データ風の機能ですpin/pinInBackground:。オブジェクトをピン留めするだけで、インターネットがあることがわかったら、ピンを解除してバックエンドに保存できます。別の方法として、到達可能性をすぐに呼び出し、インターネットがない場合pin:はオブジェクトを、それ以外の場合はsaveInBackground:最初に呼び出すこともできます。または、単にキャッシング ポリシーを利用します。


参考文献

于 2015-01-16T11:54:39.067 に答える
1

SDKのバグでした(1.6.2)

ここに提出: https://developers.facebook.com/bugs/1554492594835537/

于 2015-02-05T13:04:41.620 に答える