无法使用AFNetworking 3.0

时间:2016-07-20 15:22:51

标签: ios json asynchronous afnetworking-3

我是IOS开发的新手,所以我可能只是缺少一些基础知识。已经在这个问题上苦苦挣扎了2天了。 所以,在这里。 我的API类中有一个数据任务:

//request generation, putting url and dictionary into it

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if(!error)
    {
        self.jsonDictionary = responseObject;
        NSInteger HTTPStatusCode = [(NSHTTPURLResponse *)response statusCode];
        NSLog(@"RESPONSE DATA:  %@", self.jsonDictionary);
        self.didSendRequest = YES;
    }
    else
    {
        self.didSendRequest = NO;
        NSLog(@"ERROR:  %@", error);
    }
}];
[dataTask resume];

然后像这样检索json字典:

-(NSDictionary *)returnJSON{
if(self.didSendRequest) return self.jsonDictionary;
else NSLog(@"No dictionary dowloaded");
return self.jsonDictionary;}

然后,在其他类中,我将url和字典传递给数据任务方法,并得到如下响应:

-(NSDictionary*)userLogin : (NSString* )email : (NSString*) password {
dataTaskClass* aph = [[dataTaskClass alloc] init];

NSDictionary *userParams = [[NSDictionary alloc] initWithObjectsAndKeys:
                            email,@"email",
                            password,@"password",
                            nil];
[aph postRequest: @"myUrl"];
return dataTaskClass.returnJSON;}

最后我在我的视图控制器类中调用它:

    //button click method here
response = [lh userLogin : userEmail : userPass];
            if (response) {//do some action}

所以,是的,正如你所看到的,我调用一个方法,然后异步执行下载任务,然后立即检查返回值,当然是“null”。 那么我如何将返回值与dataTask同步,或者以其他方式检查它的完成情况呢?

已经尝试过愚蠢的“while循环”和信号量方法,两者都悬挂主线程,正如预期的那样。 通过通知尝试了一些东西,但最终没有任何结果。

我很确定它有一个该死的简单解决方案,但无法得到它。

很高兴能得到任何帮助。

1 个答案:

答案 0 :(得分:0)

是的,你遗漏了一些基础知识。

您无法调用异步操作的方法并立即获得答案。解决方案是编写方法以获取完成块。然后传递要在完成块中执行的代码。方法调用在结果可用之前立即返回,但是一旦下载任务完成,就会调用完成块代码。

我写了一个SO答案,其中包含一个示例应用程序,但它是用Swift编写的。如果您是iOS开发的全新产品并且在Objective-C中工作,您可能会发现很难遵循。

如果您只是在学习iOS开发,那么您应该认真考虑学习Swift。 Apple非常清楚Swift是iOS开发的未来。学习Objective-C也很有用,但我建议你把重点放在Swift上。