等待返回,直到对象具有值



我有一个被调用的方法,它看起来像这样:

- (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;
}

最新更新