如何等待NSURLSession的完成?

时间:2015-07-01 13:29:20

标签: ios objective-c

我有一个从服务器下载二进制文件并返回它的方法。 但是在NSURLSession完成之前,我的函数正在返回值,所以每次都是nil。 我怎么能等到下载完成然后返回二进制文件?

3 个答案:

答案 0 :(得分:1)

试试这个 -

NSURLSession *delegateFreeSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];

    [[delegateFreeSession dataTaskWithURL: [NSURL URLWithString: @"http://www.example.com/"]
                       completionHandler:^(NSData *data, NSURLResponse *response,
                                           NSError *error) {
                           NSLog(@"Got response %@ with error %@.\n", response, error);
                           NSLog(@"DATA:\n%@\nEND DATA\n",
                                 [[NSString alloc] initWithData: data
                                         encoding: NSUTF8StringEncoding]);

                         [self loadDataToView:data]; // << your custom method inside the MyViewControllerClass
                       }] resume];

答案 1 :(得分:1)

您的方法应该将回调作为参数。一旦NSURLSession完成处理程序获得了您需要的对象,就可以使用数据调用该回调(如果从服务器收到错误,则调用NSError对象)

你不能等待&#39;在获得数据后继续执行。根据定义,这种网络操作是异步处理的,因此需要回调。

更新:下面的示例代码

day=datePicker.getDayOfMonth();
month=datePicker.getMonth() + 1;
year=datePicker.getYear();

答案 2 :(得分:0)

以下是NSURLSession的完成处理程序示例。

-(void) httpPostWithCustomDelegate{
    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];

    NSURL * url = [NSURL URLWithString:@"http://hayageek.com/examples/jquery/ajax-post/ajax-post.php"];
    NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:url];
    NSString * params =@"name=Ravi&loc=India&age=31&submit=true";
    [urlRequest setHTTPMethod:@"POST"];
    [urlRequest setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]];

    NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest
                                        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                          NSLog(@"Response:%@ %@\n", response, error);
                                          if(error == nil)
                                          {
                                              NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
                                              NSLog(@"Data = %@",text);
                                          }

                                      }];
    [dataTask resume];

}

Here is good tutorial for NSURLSession.