0

私のアプリはAFNetworkingTwitterAPIアクセスに使用しており、サブクラス化してTwitterAPIクライアントを作成しましたAFHTTPClient

#import "AFHTTPClient.h"

@interface TwitterAPIClient : AFHTTPClient

+ (TwitterAPIClient *)sharedClient;

@end

#import "TwitterAPIClient.h"
#import "AFJSONRequestOperation.h"

static NSString * const kAFTwitterAPIBaseURLString = @"http://api.twitter.com/1/";

@implementation TwitterAPIClient

+ (TwitterAPIClient *)sharedClient {
    static TwitterAPIClient *_sharedClient = nil;
    static dispatch_once_t TwitterAPIClientToken;
    dispatch_once(&TwitterAPIClientToken, ^{
        _sharedClient = [[TwitterAPIClient alloc] initWithBaseURL:[NSURL URLWithString:kAFTwitterAPIBaseURLString]];
    });

    return _sharedClient;
}

- (id)initWithBaseURL:(NSURL *)url {
    self = [super initWithBaseURL:url];
    if (!self) {
        return nil;
    }

    [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
    [self setDefaultHeader:@"Accept" value:@"application/json"];

    return self;
}

@end

を使用するgetPath's & postPath'sと、を操作クラスとしてTwitterAPIClient登録するため、APIクライアントはJSON応答を正しく返します。AFJSONRequestOperation

ただし、関数を使用せずにカスタムNSMutableURLRequestリクエストを作成する必要がある場合がありgetPath's & postPath's AFHTTPClientます。

これらのリクエストを使用すると、クライアントからの応答は標準であり、からの応答ではNSDataありませNSDictionaryAFJSONRequestOperation

 NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/1.1/account/verify_credentials.json"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [self.auth authorizeRequest:request];

    AFHTTPRequestOperation* apiRequest = [[TwitterAPIClient sharedClient] HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, NSDictionary* responseObject) {
        [self createAccount];

        self.account.username = [responseObject objectForKey:@"screen_name"];

        dispatch_async(dispatch_get_main_queue(), ^{
            [self.delegate didProfileLoaded:self.account];
        });


    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        if (error!=nil) {
            NSString* errorMessage = nil;
            NSString* errorData = [error.userInfo objectForKey:NSLocalizedRecoverySuggestionErrorKey];

            if (errorData!=nil) {
                NSError* error;
                NSDictionary* json = [NSJSONSerialization JSONObjectWithData:[errorData dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error];
                if (json!=nil && error==nil) {
                    NSArray* errorMeta = [json objectForKey:@"errors"];
                    if (errorMeta!=nil) {
                        errorMessage = [[errorMeta objectAtIndex:0] objectForKey:@"message"];
                    }
                } else {
                    errorMessage = errorData;
                }
            }

            dispatch_async(dispatch_get_main_queue(), ^{
                [self.delegate didUpdateFailed:errorMessage];
            });
        }

    }];

    [[TwitterAPIClient sharedClient] enqueueHTTPRequestOperation:apiRequest];

これらをオブジェクトとして強制的AFHTTPRequestOperationに作成する方法はありますか?AFJSONRequestOperation

4

1 に答える 1

1

次のように、AFJSONRequestOperationを直接作成するだけです。

    AFJSONRequestOperation* apiRequest = [[AFJSONRequestOperation alloc] initWithRequest:request];
[apiRequest setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

// ....

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

// ...

}];

ここここに他の例があります。

于 2013-03-12T09:59:25.473 に答える