0

AFNetworkingリクエストが終了したときにコールバックを取得することは可能ですか? 私はエッジ ケースがあるアプリを作成しています。ダウンロードされたすべてのアイテムがチェックされますis_deleted(UI に表示されるべきではありません)。この場合、古いデータを自動的にダウンロードしようとします (新しいAFNetworkingリクエストを作成します)。

loadDataメソッド自体から再度メソッドを呼び出そうとしました。しかし、それは無限ループを作成します。このような:

- (void)loadDataIsOlder:(NSNumber *)older
{    
    NSURLRequest *request = [NSURLRequest requestWithURL:self.streamUrl];
    AFJSONRequestOperation *operation;
    operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id jsonObject) {
        NSDictionary *data = [jsonObject objectForKey:@"data"];
        NSDictionary *meta = [jsonObject objectForKey:@"meta"];
       [...]
        for (NSNumber *deleted in (NSArray *)[data valueForKey:@"is_deleted"]) {
            if ([deleted boolValue] == YES) {
                self.shouldTryToLoadMore = YES;
            } else {
                self.shouldTryToLoadMore = NO;
            }
        }
        if (self.shouldTryToLoadMore == YES) {
            [self loadDataIsOlder:[NSNumber numberWithBool:YES]];
        }
    } [...]
}

だから、それは私がやりたいことをするための他の/より良い方法なのだろうか。

サブ質問 配列(NSArray *)[data valueForKey:@"is_deleted"]は BOOL int 値で構成されています。[1, 1, 1, 0] = 3 のように、int を含む配列の値を簡単に計算できるのでしょうか? 配列内のすべての値が 1:s かどうかを確認したい。

4

2 に答える 2

1

AFNetworking に詳しくない

AFNetworking がリクエストを終了したときにコールバックを取得することは可能でしょうか?

いつでも操作の完了ブロックを設定できます (失敗した場合でも、操作が実行されるスレッドで呼び出されるため、UI の更新には注意してください)。
そのようです:operation.completionBlock = ^{/*what ever you like to accomplish*/};

ダウンロードされたすべてのアイテムがチェックされます

アルゴリズムに小さな問題を見つけました。
削除キーが適切に蓄積されていません (最後のアイテム ステータスにのみ応答します)。
試してください:あなたの声明self.shouldTryToLoadMore &= [deleted boolValue];の代わりに。if

(「目に見える」ループを避けるために)ショートしたものが好きなら、試してください:

NSMutableSet* set = [NSMutableSet setWithArray:[data valueForKey:@"is_deleted"]];
[set addObject:@YES];
if ([set count] == 1) {
//You have only deleted items in your request
}

note
成功ブロックで キャプチャselfしているため、問題が発生する可能性があります ( で操作を所有している場合はサイクルを保持してくださいself)。

于 2013-04-23T18:51:49.457 に答える
1

再試行カウンターを設定して失敗ブロックに入れることができるため、次のようになります。

        - (void)loadDataIsOlder:(NSNumber *)older
    {   
 if (shouldTrytoReloadMore){
        NSURLRequest *request = [NSURLRequest requestWithURL:self.streamUrl];
        AFJSONRequestOperation *operation;
        operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id jsonObject) {
            NSDictionary *data = [jsonObject objectForKey:@"data"];
            NSDictionary *meta = [jsonObject objectForKey:@"meta"];
           [...]
            for (NSNumber *deleted in (NSArray *)[data valueForKey:@"is_deleted"]) {
                if ([deleted boolValue] == YES) {
                    self.shouldTryToLoadMore = YES;
                    [self loadDataIsOlder:[NSNumber numberWithBool:YES]];

                } else {
                    self.shouldTryToLoadMore = NO;
                }
            }
            }
        } [...]
    }
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
}

メソッドを初めて呼び出すときは、再試行する必要がある回数として n を設定します。

于 2013-04-23T18:52:01.630 に答える