title: synchronous NSURLSessionDataTask using objective-c
body: <p>I'm try to do synchronous NSURLSessionDataTask with the below code but unable to proceed.</p>
  
  <pre><code>__block NSData *rData = nil;
    __block BOOL taskDone = NO;
   __block NSData *rError = nil;
  
  
      NSURL *url = [NSURL URLWithString:dataURL];
      NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:1 timeoutInterval:30];
  
      NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration ephemeralSessionConfiguration] delegate:nil delegateQueue:nil];
      NSURLSessionDataTask *taskData = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
          rData = [NSData dataWithData:data];
          rError = [error copy];
  
          taskDone = YES;
      }];
  
      [taskData resume];
  
      while (taskDone == NO) {
          if (_close == YES) {
              [taskData cancel];
              return nil;
          }
          usleep(20000);
      }
  </code></pre>
  
  <p>I need to synchronous call so that I can remove the while loop which is not needed.
  Below is my code with synchronous call using semaphore</p>
  
  <pre><code> dispatch_semaphore_t sem;
     __block NSData *rData = nil;
     __block BOOL taskDone = NO;
    __block NSData *rError = nil;
  
  
      NSURL *url = [NSURL URLWithString:dataURL];
      NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:1 timeoutInterval:30];
  
      // creating semaphore
      sem = dispatch_semaphore_create(0);
      NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration ephemeralSessionConfiguration] delegate:nil delegateQueue:nil];
      NSURLSessionDataTask *taskData = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
          rData = [NSData dataWithData:data];
          rError = [error copy];
  
          taskDone = YES;
  
          //call semaphore
          dispatch_semaphore_signal(sem); 
      }];
  
      [taskData resume];
      dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
      dispatch_release(sema);
  
  
     // THIS part not sure...  how can we accommodate this below code
      while (taskDone == NO) {
          if (_close == YES) {
              [taskData cancel];
              return nil;
          }
          usleep(20000);
      }
  </code></pre>
  
  <p>above code could be correct ?</p>