使用信号量从Parse返回图像

时间:2013-11-26 05:23:23

标签: ios objective-c multithreading parse-platform

我希望能够从解析中检索图像:

-(UIImage *) image {

   __block NSData * imageData;
   dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

     [self.imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
        imageData = data;
        dispatch_semaphore_signal(semaphore);
     }];

     dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
     return [UIImage imageWithData:imageData];
}

但是由于块在邮件线程上执行并且信号量正在主线程上等待,因此永远不会执行该块。我怎样才能重做我的代码?我需要能够返回没有completionBlock的图像,因为这个方法是由我使用的库调用的。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用GCD,在后台解析和加载,然后使用主线程中的图像。 代码可能如下:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        UIImage *image = nil;
        __block NSData *imageData;
        [self.imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
            imageData = data;
        }];
        image = [UIImage imageWithData:imageData];

        dispatch_sync(dispatch_get_main_queue(), ^{
            if (image) {
                return image; // use your image here.
            } 
        });

    });

答案 1 :(得分:0)

完成块在主线程上运行...被阻塞等待你的信号量。你这里有僵局。您是否考虑在后台线程中使用同步getData来获取信息?