Подтвердить что ты не робот

Замена для AFJSONRequestOperation в AFNetworking 2.x

Я делаю базовое приложение для iPhone с запросами HTML, следуя этот учебник.

В моем учебном пособии используется AFJSONRequestOperation в AFNetworking. Проблема в том, что я использую AFNetworking версии 2, у которой больше нет функции AFJSONRequestOperation.

Итак, конечно, этот код (примерно на полпути вниз по учебнику под заголовком "" Запрос API поиска в iTunes Store ") не компилируется:

NSURL *url = [[NSURL alloc]
    initWithString:
    @"http://itunes.apple.com/search?term=harry&country=us&entity=movie"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
AFJSONRequestOperation *operation =
    [AFJSONRequestOperation JSONRequestOperationWithRequest:request
    success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        NSLog(@"%@", JSON);
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response,
        NSError *error, id JSON) {
            NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
    }];
[operation start];

Мой вопрос: что я должен заменить AFJSONRequestOperation, чтобы я мог продолжать работать с AFNetworking 2.x? Я искал это и обнаружил, что никто больше не задает этот вопрос.

4b9b3361

Ответ 1

Не могли бы вы использовать AFHTTPSessionManger? Так что что-то вроде

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager GET:[url absoluteString]
  parameters:nil
     success:^(NSURLSessionDataTask *task, id responseObject) {
         NSLog(@"JSON: %@", responseObject);
     }
     failure:^(NSURLSessionDataTask *task, NSError *error) {
        // Handle failure
     }];

Другой альтернативой может быть использование AFHTTPRequestOperation и снова установить responseSerializer в [AFJSONResponseSerializer serializer]. Так что что-то вроде

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] 
                                            initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation
                                                        , id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // Handle error
}];

Ответ 2

Из Статья NSHipster по AFNetworking 2:

Одним из прорывов новой архитектуры AFNetworking 2.0 является использование сериализаторов для создания запросов и анализа ответов. Гибкая конструкция сериализаторов позволяет переносить больше бизнес-логики на сетевой уровень, а для ранее встроенного поведения по умолчанию легко настраиваться.

В AFNetworking 2 сериализаторы (объекты, которые превращают HTTP-данные в используемые объекты Objective C) теперь являются отдельными объектами из объекта операции запроса.

AFJSONRequestOperation и т.д., поэтому больше не существует.

Из документ AFJSONResponseSerializer:

AFJSONResponseSerializer является подклассом AFHTTPResponseSerializer, который проверяет и декодирует ответы JSON.

Есть несколько способов попасть в API, о котором вы говорили. Здесь один:

NSURL *url = [[NSURL alloc] initWithString:@"http://itunes.apple.com/search?term=harry&country=us&entity=movie"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"success: %@", operation.responseString);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"error: %@",  operation.responseString);
}];

[operation start];