我是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循环”和信号量方法,两者都悬挂主线程,正如预期的那样。 通过通知尝试了一些东西,但最终没有任何结果。
我很确定它有一个该死的简单解决方案,但无法得到它。
很高兴能得到任何帮助。
答案 0 :(得分:0)
是的,你遗漏了一些基础知识。
您无法调用异步操作的方法并立即获得答案。解决方案是编写方法以获取完成块。然后传递要在完成块中执行的代码。方法调用在结果可用之前立即返回,但是一旦下载任务完成,就会调用完成块代码。
我写了一个SO答案,其中包含一个示例应用程序,但它是用Swift编写的。如果您是iOS开发的全新产品并且在Objective-C中工作,您可能会发现很难遵循。
如果您只是在学习iOS开发,那么您应该认真考虑学习Swift。 Apple非常清楚Swift是iOS开发的未来。学习Objective-C也很有用,但我建议你把重点放在Swift上。