How to wrap an asynchronous method that takes a block and turn it synchronous in Objective-C

后端 未结 4 954
感情败类
感情败类 2021-02-02 18:03

I want to wrap an async API that look like this:

[someObject completeTaskWithCompletionHandler:^(NSString *result) {

}];

into a synchronous m

4条回答
  •  心在旅途
    2021-02-02 18:16

    dispatch_semaphore_wait blocks the main queue in your example. You can dispatch the async task to a different queue:

    __block NSString *returnResult;
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0UL);
    dispatch_async(queue,^{
         result = [someObject completeTaskSynchronously];
    });
    

    Or use some other system, like NSRunLoop:

       __block finished = NO;
       [self completeTaskWithCompletionHandler:^(NSString *result) {
           resultResult = result;
           finished = YES;
       }];
        while (!finished) {
            // wait 1 second for the task to finish (you are wasting time waiting here)
            [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1]];
        }
    

提交回复
热议问题