0

AFNetworking の使用に問題のあるコードがあります。

#import "SyncProfile.h"
#import "AFNetworking.h"

@implementation SyncProfile: NSObject 
@synthesize delegate = _delegate;


- (BOOL)syncProfile {
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSString *token =[userDefaults objectForKey:@"token"];
    int user_id = [userDefaults objectForKey:@"user_id"];
    if([token length]) {

        self.profileData = [[self sendRequest:@"method.get" token:token withUser:user_id andParameters:@"param1,param2"] valueForKeyPath:@"response"];
        NSLog(@"%@", self.profileData);

        return YES;
     } else
         return NO;

}

-(id)sendRequest:(NSString *)apiMethod token:(NSString *)token withUser:(int)user_id andParameters:(NSString *)param {

NSMutableString *apiLink = [NSMutableString stringWithFormat:@"https://domain.com/method/%@?uid=%@&fields=%@&access_token=%@", apiMethod, user_id, param, token];
    NSURL *url = [[NSURL alloc] initWithString:apiLink];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        NSLog(@"%@", JSON);
        self.req = JSON;
        [self myMethod:JSON];

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
    }];
    [operation start];
    return self.req;
}

- (id)myMethod:(id)data {
    NSLog(@"%@",data);
    return 0;
}

@end

結果の AFNetworking back メソッドで変数を返す必要があります。しかし、メソッドが返すよりもずっと後に結果が返されます。結果を処理するために別の方法を使用すると、そうではありません。を使用してみました[operation waitUntilFinished]が、何も変わりませんでした。

Xcode 出力の結果:

//Return variable from "sync" method
2013-02-26 23:57:29.793 walkwithme[13815:11303] (null)
//Return from AFN response
2013-02-26 23:57:31.063 walkwithme[13815:11303] {response = ({someJSON})}
//Return from MyMethod
2013-02-26 23:57:31.063 walkwithme[13815:11303] {response = ({someJSON})}
4

1 に答える 1

1

wait絶対にメソッドを使用したくありません。あなたがする必要があるのは、成功ブロックと失敗ブロックでコールバックすることです。この質問で示した方法でこれを行うことができ、メッセージパッシングなどの他のことも行うことができます。実現する重要なことは、典型的なメソッドの戻りパターンを使用しないということです。このような非同期メソッドを使用する理由は、いつ終了するかわからないため、ブロックコールバックを使用する理由です。wait私が言ったように、アプリケーションを完全にブロックする可能性があるため、絶対にそうしたくありません。

編集:

私は自分のプロジェクトの 1 つでこのコードを使用します。

メソッドの宣言

- (void)postText:(NSString *)text
     forUserName:(NSString *)username
   ADNDictionary:(NSDictionary *)dictionary
       withBlock:(void(^)(NSDictionary *response, NSError *error))block;

次に、このメソッド内で、これらのパラメーターをネットワーク リクエストに渡します。

ブロック内の戻り値:

if (block) {
    block(responseObject, someError);
}

次に、次のように呼び出します。

[[KSADNAPIClient sharedAPI] postText:postText
                             forUserName:username
                           ADNDictionary:parameters
                               withBlock:^(NSDictionary *response, NSError *error)
    {
        if (error) {
               // Deal with error
        } else {
               // Probably success!
        }
    }

このようにして、呼び出されたメソッドはその値をブロック内の呼び出し元メソッドに返します。ブロックを呼び出し元に任せると思います。

于 2013-02-26T21:15:37.257 に答える