使用 AFJSONRequestOperation 返回 JSON
Posted
技术标签:
【中文标题】使用 AFJSONRequestOperation 返回 JSON【英文标题】:return JSON with AFJSONRequestOperation 【发布时间】:2012-12-07 13:20:37 【问题描述】:我已经实现了 AFNetworking 框架,但是我试图找出一种方法,将 AFJSONRequestOperation 函数放在一个单独的类中,并从我的各个视图控制器中调用它。
我所做的是创建一个类方法,该方法接受字典中的参数和 web 服务 url。我希望这能够从成功块返回 JSON 数组和 Http 代码,但这不起作用。
如果我将公共函数更改为具有返回类型并在方法结束时返回一个值,它会在成功块完成之前返回。
有什么建议吗?
+ (void)RequestJSON:(NSDictionary *)params:(NSString *)webServicePath
NSURL *url = [NSURL URLWithString:@"http://api.website.com/"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:webServicePath parameters:params];
NSLog(@"%@", request);
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
NSString *httpCode = [[JSON valueForKey:@"meta"]valueForKey:@"code"];
NSLog(@"code=%@", httpCode);
failure:^(NSURLRequest *request , NSURLResponse *response , NSError *error , id JSON)
NSLog(@"Failed: %@",[error localizedDescription]);
];
[operation start];
【问题讨论】:
【参考方案1】:根据其他用户的推荐,我最终创建了自己的委托,它在成功和失败方法中执行两个选择器,didReceiveJSON 和 didNotReceiveJSON。
编辑:这是我的代码:)
JSONRequest.h
#import <Foundation/Foundation.h>
@class JSONRequest;
@protocol JSONRequest <NSObject>
- (void)didReceiveJSONResponse:(NSDictionary*)JSONResponse;
- (void)didNotReceiveJSONResponse;
@end
@interface JSONRequest : NSObject
id <JSONRequest> delegate;
@property (strong, nonatomic) id <JSONRequest> delegate;
- (void)RequestJSON:(NSDictionary* )params:(NSString*)webServicePath;
@end
JSONRequest.m
#import "JSONRequest.h"
#import "AFHTTPClient.h"
#import "AFJSONRequestOperation.h"
@implementation JSONRequest
@synthesize delegate;
- (void)RequestJSON:(NSDictionary *)params:(NSString *)webServicePath
NSURL *url = [NSURL URLWithString:@"http://api.mysite.com"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:webServicePath parameters:params];
NSLog(@"%@", request);
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
NSDictionary *jsonDictionary = JSON;
[delegate performSelector:@selector(didReceiveJSONResponse:) withObject:jsonDictionary];
failure:^(NSURLRequest *request , NSURLResponse *response , NSError *error , id JSON)
NSLog(@"Failed: %@",[error localizedDescription]);
[delegate performSelector:@selector(didNotReceiveJSONResponse)];
];
[operation start];
@结束
【讨论】:
你能举个例子吗?我怎样才能拨打这个电话并从didReceiveJSONResponse
获得回报?
你能告诉我如何使用它吗?我试图做一些类似的事情:在 my.h 文件中我有 JSONRequest* 请求;我还在 .h 文件中设置了委托,就像 函数返回是因为它的任务只是设置 OperationQueue。一旦它这样做了,它就会像往常一样继续它的流动。您是否考虑过为其实现委托?您可以发布一条消息,例如 JSONRequestDidComplete
并将 JSON 字典作为参数传递。然后,您可以使用视图控制器中设置为请求类的委托的字典来执行所需的操作。
【讨论】:
【参考方案3】:您的 AFJSONRequestOperation 异步运行!所以它不在主线程上运行(我认为这是 AFJSONRequestOperation 的目的),但您的 + (void)RequestJSON:(NSDictionary *)params:(NSString *)webServicePath
方法在主线程上执行,因此立即完成。例如,here's 有人问同样的问题。
因为 AFJSONRequestOperation 是基于 NSOperation 的,所以你可以将它添加到 mainQueu。 但是从主线程发送同步请求是个坏主意。但也许只需查看this workaround。
【讨论】:
【参考方案4】:我使用非常相似的设置。我所做的是创建了一个委托,异步请求可以调用并传递 JSON/NSDictionary。其他答案是正确的,该方法将在网络请求完成之前完成。这很好。创建一个类来放入您的网络调用并设置您的视图控制器实现的成功和失败方法。这些将在请求完成时被调用,您将从没有被阻止的 UI 中受益。
【讨论】:
以上是关于使用 AFJSONRequestOperation 返回 JSON的主要内容,如果未能解决你的问题,请参考以下文章
如何从 AFNetworking 和 AFJSONRequestOperation 获得可变字典?
AFJSONRequestOperation 不更新块外的内容
iOS AFJSONRequestOperation 返回空结果