等待返回,直到对象有值

时间:2015-11-02 00:48:48

标签: ios objective-c nsurlconnection

我有一个被调用的方法,如下所示:

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

2 个答案:

答案 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;
}