使用GCD创建元素队列

时间:2014-05-26 01:15:17

标签: ios objective-c image queue grand-central-dispatch

我已下载图像并将其保存到GCD,更新图像数量并在队列中执行发布通知。现在发生的事情是它没有注册我已经下载了图像。有时我会遗漏一些图像,我认为这是因为我在GCD逻辑中遗漏了一些东西。

这是我的代码:

for (NSString *i in items)
{
[[RequestAPI sharedInstance]downloadImage:i completion:^(AFHTTPRequestOperation *operation, UIImage *image, NSError *error) {

 //1. here main thread I receive images and go to BG

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

   //2. here I save image on disk and get path
        NSString *path = [ImageManager saveImageToDisk:image toEntity:entity withparams:@{@"save" : @"lala"}];
      __block  NSMutableDictionary *attachments = [NSMutableDictionary dictionary];
      __block  NSMutableArray *photoPaths = [NSMutableArray array];



      dispatch_async(dispatch_get_main_queue(), ^{

       //3. here I load entity and dictionary from it with NSKeyedUnarchiver from CD and set to it image path
        if (entity.attachments)
        {
            attachments = [NSKeyedUnarchiver unarchiveObjectWithData:entity.attachments];
            if (attachments[type])
            {
                photoPaths = attachments[type];
            }
        }

          dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

          //4. here I check all images equality ti themselves  in entity   
        BOOL haveDublicate = NO;
        NSData *i = [ImageManager imageDataFromPath:path];
        NSArray *photoImages = [ImageManager imageDatasFromPaths:photoPaths];
        for (NSData *saved in photoImages)
        {
            if ([saved isEqualToData: i])

            {
                haveDublicate = YES;
            }
        }

        if (!photoPaths)
        {
            photoPaths = [NSMutableArray array];
        }



               dispatch_async(dispatch_get_main_queue(), ^{

               //5. and finally if all ok I save image path, change load counter and post notification
                         if (path.length
            && ![photoPaths containsObject:path]
            && !haveDublicate
            )
        {
            [photoPaths addObject:path];
            [savedLinks setObject:photoPaths forKey:type];

            entity.attachments = [NSKeyedArchiver archivedDataWithRootObject:savedLinks];

            [self saveContext];
        }
        [RequestAPI sharedInstance].downloadsCount -= 1;
        [[NSNotificationCenter defaultCenter]postNotificationName:kReloadFeedData object:nil];



               });
           });
       });
    });
}];

我想在这里我需要1-2-3-4-5来获得理想的结果。我是对的还是我该如何排队呢?

0 个答案:

没有答案