2

AFNetworkingフレームワークを実装しましたが、AFJSONRequestOperation関数を別のクラスに配置し、個々のビューコントローラーから呼び出す方法を見つけようとしていました。

私が行ったことは、辞書のパラメーターとWebサービスのURLを受け取るクラスメソッドを作成することです。これでSuccessブロックからJSON配列とHttpコードを返すことができるようにしたいと思いますが、これは機能していません。

public関数をreturn型に変更し、メソッドの最後に値を返すと、successブロックが完了する前に戻ります。

助言がありますか?

+ (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

4 に答える 4

5

他のユーザーの推奨から、成功メソッドと失敗メソッドで2つのセレクターdidReceiveJSONとdidNotReceiveJSONを実行する独自のDelegateを作成することになりました。

編集:これが私のコードです:)

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];

}

@終わり

于 2012-12-07T14:56:57.517 に答える
0

AFJSONRequestOperationは非同期で実行されます!したがって、メインスレッドでは実行されませんが(これはAFJSONRequestOperationの目的だと思います)、+ (void)RequestJSON:(NSDictionary *)params:(NSString *)webServicePathメソッドはメインスレッドで実行されるため、すぐに終了します。たとえば、同じ質問をしている人がいます

AFJSONRequestOperationはNSOperationに基づいているため、mainQueuに追加できます。ただし、メインスレッドから同期リクエストとして送信することはお勧めできません。ただし、この回避策を確認してください。

于 2012-12-07T13:37:32.700 に答える
0

関数は、OperationQueueを設定するだけのタスクであるため戻ります。それを行うと、通常どおりフローを続行します。デリゲートの実装を検討しましたか?のようなメッセージを投稿してJSONRequestDidComplete、JSONディクショナリをパラメータとして渡すことができます。次に、要求しているクラスのデリゲートとして設定されているViewControllerのディクショナリを使用して必要なことを実行できます。

于 2012-12-07T13:37:48.700 に答える
0

私は非常によく似た設定を使用します。私が行ったのは、非同期リクエストが呼び出してJSON/NSDictionaryを返すことができるデリゲートを作成したことです。他の答えは正しいです、メソッドはネットワーク要求が行われる前に完了します。これはいい。ネットワーク呼び出しを入れるクラスを作成し、ViewControllerが実装する成功と失敗のメソッドを設定します。これらはリクエストが完了すると呼び出され、UIがブロックされないというメリットがあります。

于 2012-12-07T14:54:26.530 に答える