title: NSOperationQueue setSuspended:NO not starting queue, NSLog does
body: <p>I've got a non-concurrent NSOperation running, which has a part in which a lot of network calls are made and the results processed. This seemed like an easy target for parallelization, so I did the following:</p>
  
  <pre><code>NSOperationQueue *downloadOperationQueue = [[NSOperationQueue alloc] init];
  downloadOperationQueue.maxConcurrentOperationCount = 5;
  
  self.operationThread = [NSThread currentThread];
  //prevent the operation queue from starting until we're ready to receive events
  [downloadOperationQueue setSuspended:YES];
  
  for (FooInfo *fooInfo in foos)
  {
      //FooDownloadOperation is a non-concurrent operation.
      FooDownloadOperation *downloadOp = [[FooDownloadOperation alloc] initWithFoo:fooInfo];
      downloadOp.delegate = self;
      [downloadOperationQueue addOperation:downloadOp];
  }
  //unsuspend the queue and spin a run loop until the local operation count hits zero
  [downloadOperationQueue setSuspended:NO];
  while (self.isCancelled == NO &amp;&amp; [downloadOperationQueue operationCount] &gt; 0) 
  {
      [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1.0f]];
  }
  // ... do other things
  </code></pre>
  
  <p>and there's another method that -main in FooDownloadOperation calls, which does a performSelector:onThread: to jump back to self.operationThread to process the results: </p>
  
  <pre><code>- (void)downloadOperation:(FooDownloadOperation *)downloadOp didSucceed:(NSArray *)results
  {
      if ([[NSThread currentThread] isEqual:self.operationThread] == NO)
      {
          //too many arguments for -performSelector:onThread:withObject:waitUntilDone:
          NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:_cmd]];
          [inv setTarget:self];
          [inv setSelector:_cmd];
          [inv setArgument:&amp;downloadOp atIndex:2];
          [inv setArgument:&amp;results atIndex:3];
          [inv retainArguments];
          [inv performSelector:@selector(invoke) onThread:self.operationThread withObject:nil waitUntilDone:YES];
          return;
      }
  
      //... process the results
  }
  </code></pre>
  
  <p>No problem. In theory. </p>
  
  <p>In fact, about 70% of the time, worse after waking the device up from sleep and running the operation, it just sits in the while loop, -runMode:untilDate: returning NO. Strangely, after anywhere from 20 seconds to 6 minutes, the FooDownloadOperations finally start. </p>
  
  <p>To make matters more bizarre, if I add logging inside the while loop, it starts working as expected. I could just add some logging, but I'd really rather know why that seems to fix the issue. </p>