2012-12-07 54 views
2

我已經實現了AFNetworking框架,但我試圖找出一種方法,使AFJSONRequestOperation函數在一個單獨的類,並從我個人的視圖控制器調用它。返回JSON與AFJSONRequestOperation

我所做的是創建一個類方法,該方法將字典和webservice 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]; 

} 

回答

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

+0

可以讓你使用的例子嗎?我怎麼能做這個調用,並從'didReceiveJSONResponse'返回? –

+0

你能展示如何使用它?我試圖做一些謊言:在my.h文件中我有JSONRequest *請求;並且我還將該代理設置爲.h文件,如。在我的.m文件中,我做了一些叫做:request.delegate = self;並且我請求RequestWithMetho並傳入正確的參數來調用該方法,但是此方法不想處理該方法調用。您能否請您詳細解釋如何在您的視圖控制器中使用此文件。請幫忙。謝謝你jcrowsen – Pavan

0

您的AFJSONRequestOperation異步運行!所以它不運行在主線程(這是我認爲AFJSONRequestOperation的目的),但你的+ (void)RequestJSON:(NSDictionary *)params:(NSString *)webServicePath方法在主線程上執行,因此立即完成。例如,here's有人問同樣的問題。

由於AFJSONRequestOperation基於NSOperation,因此可以將其添加到mainQueu中。 但是,作爲來自主線程的同步請求發送它是一個壞主意。但也許只是檢查出this workaround

0

函數返回,因爲它的任務只是設置OperationQueue。一旦這樣做,它會像往常一樣繼續流動。你有沒有考慮過爲它實現一個委託?您可以發佈消息,如JSONRequestDidComplete,並將JSON字典作爲參數傳遞給它。然後,您可以使用您的視圖控制器中的字典來完成您需要的內容,該視圖控制器設置爲請求類的代理。

0

我使用非常類似的設置。我所做的是創建了一個委託,異步請求可以調用並傳遞JSON/NSDictionary。其他答案是正確的,該方法將在網絡請求完成之前完成。這很好。創建一個類來放置網絡調用,並設置視圖控制器實現的成功和失敗方法。這些將在請求完成時被調用,並且您將從沒有被阻止的用戶界面中受益。