使用AFJSONRequestOperation返回JSON

时间:2012-12-07 13:20:37

标签: iphone objective-c ios afnetworking

我已经实现了AFNetworking框架,但是我试图找到一种方法让AFJSONRequestOperation函数在一个单独的类中并从我的各个视图控制器中调用它。

我所做的是创建一个类方法,该方法在字典和webservice url中使用params。我希望这能够从成功块返回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];

}

4 个答案:

答案 0 :(得分:5)

根据其他用户的推荐,我最终创建了自己的Delegate,它在成功和失败方法中执行两个选择器,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];

}

@end

答案 1 :(得分:0)

您的AFJSONRequestOperation异步运行!所以它不在主线程上运行(我认为这是AFJSONRequestOperation的目的),但是你的+ (void)RequestJSON:(NSDictionary *)params:(NSString *)webServicePath方法在主线程上执行,因此立即完成。例如,here's有人问同一个问题。

因为AFJSONRequestOperation基于NSOperation,您可以将其添加到mainQueu。 但是从主线程发送同步请求是个坏主意。但也许只需查看this workaround

答案 2 :(得分:0)

该函数返回,因为它的任务只是设置OperationQueue。一旦它这样做,它就像往常一样继续流动。您是否考虑过为其实施代理?您可以发布消息,例如JSONRequestDidComplete,并将JSON字典作为参数传递给它。然后,您可以使用视图控制器中的字典执行所需操作,该字典设置为请求类的委托。

答案 3 :(得分:0)

我使用非常类似的设置。我所做的是创建了一个委托,异步请求可以调用并重新传递JSON / NSDictionary。其他答案是正确的,该方法将在网络请求完成之前完成。这很好。创建一个类来放入网络调用并设置视图控制器实现的成功和失败方法。这些将在请求完成后被调用,您将从没有被阻止的UI中受益。