我有一个被调用的方法,如下所示:
className
在此之下,getClassNamesWithClassID
有所有委托方法。变量getClassNamesWithClassID
在委托的1connectionDidFinishLoading1方法中设置。但是,它需要在上面的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";
}
完成,直到它返回{{1}}?
修改
同步连接代码:
{{1}}
答案 0 :(得分:2)
简短的回答:你不能,你不应该。
NSURLConnection(现已弃用BTW)是一种异步方法。它甚至在网络请求发送之前立即返回,收到的数据要少得多。
您需要做的是将getClassNamesWithClassID方法重构为一个方法,该方法使用类名作为该块的参数获取完成块。然后编写代码,以便将完成块保存到实例变量,并在connectionDidFinishLoading委托方法中调用它。然后编写调用者以传入应在类名称已知时调用的代码。
答案 1 :(得分:1)
您需要像下面的代码一样调用NSURLConnection同步
- (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;
}