我有一个被调用的方法,它看起来像这样:
- (NSString *)getClassNamesWithClassID: (NSNumber *) classID {
NSLog(@"Gettting Name for classID: %@", classID);
NSURLRequest *classIDRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://dphs.edu20.org/api/get_classes_with_ids?api_key=%@&classIDs=%@", apiKey, classID]]];
NSURLConnection *classIDConnection = [[NSURLConnection alloc] initWithRequest:classIDRequest delegate:self];
return className;
}
下面是NSURLConnection
的所有委托方法。变量className
是在委托的1connectionDidFinishLoading1方法中设置的。但是,它需要在上面的getClassNamesWithClassID
方法中返回。当我尝试调用getClassNamesWithClassID
方法时,该方法总是返回nil
,可能是因为NSURLConnection
需要一些时间来接收数据,然后将其设置为className
变量,但在所有这些发生之前就已经返回了。如何让方法"等待"NSURLConnection
完成,直到它返回className
?
编辑
同步连接代码:
- (NSString *)getClassNamesWithClassID: (NSNumber *) classID {
classDataArray = [[NSMutableArray alloc] init];
NEOAPIData = [[NSMutableData alloc] init];
NSLog(@"Gettting Name for classID: %@", classID);
NSURLRequest *classIDRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://dphs.edu20.org/api/get_classes_with_ids?api_key=%@&classIDs=%@", apiKey, classID]]];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * data = [NSURLConnection sendSynchronousRequest:classIDRequest
returningResponse:&response
error:&error];
if (data)
{
[NEOAPIData appendData:data];
NSString *strData = [[NSString alloc]initWithData:NEOAPIData encoding:NSUTF8StringEncoding];
NSLog(@"%@",strData);
classDataArray = [NSJSONSerialization JSONObjectWithData:NEOAPIData options:NSJSONReadingMutableLeaves error:nil];
return @"Hello";
}
return @"Error";
}
简短回答:你不能,也不应该。
NSURLConnection(现在不推荐使用BTW)是一种异步方法。它会在网络请求发送之前立即返回,收到的数据更少。
您需要做的是重构您的getClassNamesWithClassID方法,使其成为一个将具有类名的完成块作为该块参数的方法。然后编写代码,使其将完成块保存到实例变量中,并在connectionDidFinishLoading委托方法中调用它。然后编写调用程序以传入代码,一旦知道类名,就应该调用这些代码。
您需要像下面的代码一样调用NSURLConnection synchronous
- (NSString *)getClassNamesWithClassID: (NSNumber *) classID {
NSLog(@"Gettting Name for classID: %@", classID);
NSURLRequest *classIDRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://dphs.edu20.org/api/get_classes_with_ids?api_key=%@&classIDs=%@", apiKey, classID]]];
// NSURLConnection *classIDConnection = [[NSURLConnection alloc] initWithRequest:classIDRequest delegate:self];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * data = [NSURLConnection sendSynchronousRequest:classIDRequest
returningResponse:&response
error:&error];
if (error == nil)
{
// Parse data here
return className;
}
return nil;
}