用调度排队

时间:2014-11-19 10:19:18

标签: ios queue grand-central-dispatch nsoperationqueue dispatch

我正在创建队列,首先我在后台压缩图像并将其添加到主队列中的字典中。接下来所有图像包含并添加我打印消息。我不用我的代码存档它。为什么?

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSMutableArray *images = [_adv[@"images"] mutableCopy];
    for (NSMutableDictionary *i in images)
    {
        UIImage *large = [UIImage compressImage:i[@"original"]];

        dispatch_async(dispatch_get_main_queue(), ^{

            i[@"large"] = large;
            [i removeObjectForKey:@"original"];
        });
    }


    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"%@", _adv);
        NSLog(@"\n ГОТОВО");
    });
});

2 个答案:

答案 0 :(得分:0)

在主线程上运行此代码将导致死锁,因为您使用dispatch_sync两次。也许这就是问题所在。请尝试dispatch_async

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

答案 1 :(得分:0)

尝试为用户交互工作保留主队列。

您应该创建自己的队列,以便与可变数据结构进行交互。我建议为此目的使用并发队列。写作应该有障碍。

你应该在后台队列上进行后台处理,你可能应该做那些异步,因为你可能在开始工作后不需要结果并且不想阻止在背景工作上调用线程。

我建议做更像这样的事情(直接写在这里,所以可能会有一些小错误):

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSArray *images = _adv[@"images"];
    for (NSMutableDictionary *i in images.copy)
    {
        UIImage *large = [UIImage compressImage:i[@"original"]];

        dispatch_barrier_sync(queueThatYouHaveToGuardAccessToTheseData, ^{
            i[@"large"] = large;
            [i removeObjectForKey:@"original"];
        });
    }

    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"%@", _adv);
        NSLog(@"\n ГОТОВО");
    });
});

请注意,您需要提前创建queueThatYouHaveToGuardAccessToTheseData作为并发队列。将queueThatYouHaveToGuardAccessToTheseData作为此函数的输入或每个图像(或集合或类似的东西)具有单个互斥锁可能会更好,以避免单个全局写锁定。