0

我正在尝试通过Clear Read API运行一堆 URL (基本上是从 URL 中提取文章部分),并且我正在使用AFNetworking Library

我有一个AFClearReadClient类,它是AFHTTPClient我用来简化与 API 交互的子类。在那里我设置了基本 URL,事实上它是一个 JSON 请求。

#import "AFClearReadClient.h"
#import "AFJSONRequestOperation.h"

@implementation AFClearReadClient

+ (AFClearReadClient *)sharedClient {
    static AFClearReadClient *sharedClient = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedClient = [[AFClearReadClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://api.thequeue.org/v1/clear?url=&format="]];
    });

    return sharedClient;
}

- (id)initWithBaseURL:(NSURL *)url {
    if (self = [super initWithBaseURL:url]) {
        [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
        [self setDefaultHeader:@"Accept" value:@"application/json"];
    }

    return self;
}

然后我有一个存储在NSDictionary我循环的文章列表,获取每篇文章的 URL,从中为即将发生的请求制作参数(参数是 GET 变量及其在基本 URL 中的值,对吗?),然后创建请求,并将其添加到包含所有请求的数组中。

然后我将它们批量入队(我认为我做的不对)。这会创建每个请求并将其排入队列,从而将它们置于被执行的过程中,对吧?但是我在progressBlock 中做什么呢?我无权访问返回的 JSON(似乎本地变量只是NSUIntegers),所以我无法做我想做的事情(保存返回的文章文本)。

- (void)addArticlesToQueueFromList:(NSDictionary *)articles {
    // Create an array to hold all of our requests to make
    NSMutableArray *requests = [[NSMutableArray alloc] init];

    for (NSString *key in articles) {
        NSString *articleURL = [[articles objectForKey:key] objectForKey:@"resolved_url"];
        NSDictionary *requestParameters = @{@"url": articleURL,
                                            @"format": @"json"};

        NSMutableURLRequest *request = [[AFClearReadClient sharedClient] requestWithMethod:@"GET" path:nil parameters:requestParameters];
        [requests addObject:request];
    }

//  [[AFClearReadClient sharedClient] setMaxConcurrentOperationCount:5];
    [[AFClearReadClient sharedClient] enqueueBatchOfHTTPRequestOperationsWithRequests:[requests copy] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {

    } completionBlock:^(NSArray *operations) {

    }];
}

另外,我不确定我应该如何使用该setMaxConcurrentOperationCount:方法。应该在AFClearReadClient课堂上做吗?

4

1 回答 1

1

首先,您是在排队请求,而不是 requestOperations - 这是有区别的。注意函数的名称 (enqueueBatchOfHTTPRequestOperations)。在请求步骤之前你没问题 - 然后你需要创建一个 AFJSONRequestOperation。因此,一旦您收到请求,请执行以下操作:

AFJSONRequestOperation *requestOperation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
 success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON){ ...this is your success block...} 
 failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON){ ...this is your failure block...}];

现在你有一个 requestOperation ,你可以继续排队,它应该可以工作。

于 2013-03-25T05:33:04.057 回答