0

程序中有一部分:

dispatch_sync (dispatch_get_main_queue (), ^ {
    [startBtn setTitle: @ "Loading ..." forState: UIControlStateNormal];
    [self loadImages]; / / loading images - AssesLibrary
});

[self makeCollage];
NSLog (@ "Albums found:% lu", (unsigned long) [assetGroups count]);

从块dispatch_sync程序出来,我需要先执行[self loadImages](填充数据数组)的功能,然后再执行[self makeCollage]。如果没有dispatch_sync- 那么只是[self makeCollage]开始填充而不进一步处理数组并给出错误。

建议如何成为

4

3 回答 3

4

添加 :

dispatch_queue_t currentQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(currentQueue, ^{ 

    __block UIImage *image=nil; 
    dispatch_sync(currentQueue, ^{ 

        //download the image here 
        image = [self loadImages];

    }); 

dispatch_sync(dispatch_get_main_queue(), ^{ 

        //handle the image to the user here on the main queue 
        if (image != nil){ 
            [self makeCollage];
        } else 
        { 
            NSLog(@"Image isn't downloaded. Nothing to do."); 
        } 

    }); 
}); 
于 2013-10-30T09:33:22.443 回答
0

正如加布里埃尔所说,你正在造成死锁。你有两个选择:

  1. 创建一个新的同步队列,但您似乎在块中使用 UIKit。UIKit 大多数不是线程安全的,特别是对于影响显示的部分
  2. 而不是使用 dispatch_sync,而是在主队列上使用 dispatch_async

如果你想在后台线程上发送工作,你应该以不同的方式组织你的逻辑。

于 2013-10-30T08:14:17.630 回答
0

尝试这个:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, NULL), ^{
    // Do your stuff
});
于 2013-10-30T08:07:59.310 回答