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 返回方法返回一个变量。但是结果比方法返回要晚得多。当我使用不同的方法来处理结果时,它不会。尝试使用,[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因为这可能会完全阻止您的应用程序。

编辑:

我在我的一个项目中使用此代码:

声明方法

- (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 回答