5

私のアプリは、ユーザーごとにオブジェクト (PFUSER) を作成し、ユーザーが参加するイベントごとに (PF) オブジェクトを作成します。これは正常に機能します。次に、そのイベントに関連付けられた 2 つのファイルがあります。最初のファイルを PFFile に保存し、それをイベント pfobject に関連付けます。ブロックを使用してバックグラウンドでこれを行う場合、2 番目のファイルに対して制御が同じことを続けていることを確認するにはどうすればよいですか?

私はブロックを初めて使用するので、コールバックで機能しない理由がより明確になるかもしれませんが、ブロックが別のスレッドで保存を実行し、次のステップが実行される前に現在のスレッドが破棄されるようです。

もちろん、オフラインで使用できるように、これらの両方を「最終的に保存」として実行したいと思います。

あなたが私に指摘できるガイダンス/例は大歓迎です。

ありがとう!

4

3 に答える 3

11

saveEventually はまだ PFFiles をサポートしていません。再起動間のアップロードの再開を処理するには、もう少しスマートが必要です。ただし、既に使用可能な 1 つのトリックは、PFObject が PFFiles を含むその子を保存する方法を知っているということです。あなたはただ言うことができます:

PFUser *user = PFUser.currentUser;
user[@"icon"] = [PFFile fileWithData:iconData];
user[@"iconThumb"] = [PFFile fileWithData:iconThumbData];
[user saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
    // user will automatically save its files & only call this once the
    // entire operation succeeds.
}];
于 2013-02-19T19:44:13.347 に答える
1

コードを投稿していないので、私はあなたが何を意味するのか 100% ではありませんが、複数の PFFile を PFObject に関連付ける場合は、これだけで十分です。

PFObject *object = [PFQuery getObjectOfClass:@"MyFile" objectId:id];
[object addObject:profilePicture forKey:@"Photo"];
[object addObject:coverPicture forKey:@"PhotoCover"];
[object saveEventually];

ParseのドキュメントからsaveEventually、あなたが望むことをするようです:

Parse に現在アクセスできない場合でも、将来の不特定の時点でこのオブジェクトをサーバーに保存します。これは、ネットワーク接続が安定していない可能性があり、保存がいつ完了したかを知る必要がない場合に使用します。保存できないなどの問題がオブジェクトにある場合、そのオブジェクトは黙って破棄されます。オブジェクトがまだメモリ内にある間に保存が正常に完了すると、コールバックが呼び出されます。

于 2013-02-18T03:18:30.887 に答える
1

現在、saveEvetually もローカル データ ストアへの保存もサポートされていないため、以下は、少なくとも保存できるものをオフラインで保存したり、エラーを返したりするために使用している PFObject のカテゴリです。

    - (void) dr_saveWithCompletionHandler: (void(^)(NSError* error)) completionBlock {

__block BOOL canSaveEventually = YES;

[[self allKeys] enumerateObjectsUsingBlock:^(NSString* key, NSUInteger idx, BOOL *stop) {
    id object = self[key];

    if ([object isKindOfClass:[PFFile class]]) {
        PFFile* file = (PFFile*) object;

        if (!file.url || file.isDirty) {
            canSaveEventually = NO;
        }
    }
}];

void (^localCompletionHandler) (BOOL, NSError*) = ^(BOOL succeeded, NSError *error) {

    if (succeeded) {
        if (completionBlock) completionBlock(nil);

    } else {
        if (completionBlock) completionBlock(error);
    }
};

if (canSaveEventually) {
    [self saveEventually:localCompletionHandler];
} else {
    [self saveInBackgroundWithBlock:localCompletionHandler];
}

}

于 2015-01-28T16:25:09.803 に答える