Замена для AFJSONRequestOperation в AFNetworking 2.x
Я делаю базовое приложение для iPhone с запросами HTML, следуя этому руководству.
В этом уроке я использую AFJSONRequestOperation в AFNetworking. Проблема в том, что я использую AFNetworking версии 2, которая больше не имеет AFJSONRequestOperation.
Так что, конечно, этот код (примерно на полпути к уроку под заголовком "Поиск в iTunes Store API поиска") не компилируется:
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? Я прогуглил это и обнаружил, что никто другой, кажется, не задает этот вопрос.
2 ответа
Не могли бы вы использовать 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
}];
Из статьи 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];