1

AFNetworking呼び出しenqueueBatchOfHTTPRequestOperationsを使用して、ファイルのリストをWebサーバーからiPadにダウンロードするメソッドがあります。時々、操作が失敗します(通常はファイルが大きい場合)。これまで、私は各ファイルを個別にダウンロードし、特定の再試行回数まで操作を再度呼び出すだけでした。

enqueueBatchOfHTTPRequestOperationsを使用するようにコードをリファクタリングしました。これはうまく機能しますが、「特定の」操作の失敗に関する通知を受け取る方法がわかりません。また、失敗した場合にそれらをキューに再度追加する方法もわかりません。

「n」個のファイルをダウンロードするために使用しているコードは次のとおりです。

    NSMutableArray *operationsArray = [[NSMutableArray alloc]init];
for (MINPageDefinition *currPage in [[MINPageStore sharedInstance] pageArray])
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *serverLibraryURL = [defaults objectForKey:kRootURL];
    serverLibraryURL = [serverLibraryURL stringByAppendingPathComponent:kPageDefinitionsDirectory];
    serverLibraryURL = [serverLibraryURL stringByAppendingPathComponent:currPage.pageImageName];

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:serverLibraryURL]];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:currPage.pageImageURL append:NO];

    [operationsArray addObject:operation];
}
if ([operationsArray count] > 0)
{
    AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@""]];
    void (^progressBlock)(NSUInteger numberOfCompletedOperations, NSUInteger totalNumberOfOperations) = ^(NSUInteger numberOfCompletedOperations, NSUInteger totalNumberOfOperations) {
        NSLog(@"%d proccesses completed out of %d", numberOfCompletedOperations, totalNumberOfOperations);
    };
    void (^completionBlock)(NSArray *operations) = ^(NSArray *operations) {
        NSLog(@"All operations completed");
    };
    [client enqueueBatchOfHTTPRequestOperations:operationsArray
                                  progressBlock:progressBlock
                                completionBlock:completionBlock];
}

以前、操作を実行するメソッドがありました。失敗すると、失敗ブロックはそれ自体を再帰的に呼び出します。操作が失敗した場合に最大「n」回再試行するようにこのコードを変更するにはどうすればよいですか?

4

3 に答える 3

1

以下のコードを確認してください@justLearningAgain

[[WfServices sharedClient] GET:kGetAddress parameters:dicParam  success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"RESPONSE ::: %@",responseObject);
  }failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    }];


+ (WfServices *)sharedClient
{
    static WfServices * _sharedClient = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        _sharedClient = [[WfServices alloc] initWithBaseURL:[NSURL URLWithString:kWFBaseURLString]];
    });

    return _sharedClient;
}
于 2014-07-15T13:17:14.133 に答える
0

そのように、失敗した単一の操作をその操作の失敗ブロックに再度キューに入れることはできませんか?

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
     [[APIClient sharedClient] enqueueHTTPRequestOperation:operation];
}];

サブクラス[APIClient sharedClient]への参照はどこにありますか(シングルトンかどうか)。AFHTTPClient

于 2013-01-31T17:02:13.143 に答える
0

AFNetworkingの自動再試行が役立つと思います。

または、AFHTTPClientで次のメソッドをオーバーライドできます。

resumeTasksArray=キューに再追加する必要のある操作の配列を検討してください。

NSMutableArray *resumeTasksArray; before @implementation AFHTTPClient 

- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request
                                                success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                                                failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure {

void(^authFailBlock)(AFHTTPRequestOperation *opr, NSError *err) = ^(AFHTTPRequestOperation *opr, NSError *err){
    [resumeTasksArray addObject:request];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
        //now, queue up and execute the original task
        for (NSURLRequest *previousRequest in resumeTasksArray) {
            NSLog(@"^^^^^^^^^^^^^^^^^^^^^^^^^^^^Resume Task URL - %@", previousRequest.URL);
            NSMutableURLRequest *newRequest = [previousRequest mutableCopy];
            [newRequest setValue:[NSString stringWithFormat:@"Bearer %@", AppSingleton.access_token] forHTTPHeaderField:@"Authorization"];
            AFHTTPRequestOperation *opera10n = [[AFHTTPRequestOperation alloc]initWithRequest:newRequest];
            opera10n.responseSerializer = self.responseSerializer;
            [opera10n setCompletionBlockWithSuccess:success failure:failure];
            if (![[self.operationQueue operations] containsObject:opera10n]) {
                [[self operationQueue] addOperation:opera10n];
                [opera10n start];
            }
        }
        [resumeTasksArray removeAllObjects];
    });
};
AFHTTPRequestOperation *operation = [super HTTPRequestOperationWithRequest:request success:success failure:authFailBlock];
return operation;
}
于 2014-07-16T10:39:49.570 に答える