创建3个串行代码块的过程

时间:2014-05-27 10:07:21

标签: ios queue grand-central-dispatch

我有3个代码块,必须在上一个完成后逐个执行。我的实现不起作用。我需要一些帮助来做到这一点。我的代码吼叫。

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

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

       dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

       //   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(), ^{

           //block1. 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), ^{

              //block2. 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(), ^{

                   //block3. 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 个答案:

答案 0 :(得分:0)

正如dispatch_async所说,它们将按预期执行异步而不是同步。请改用dispatch_sync

如果要在单独的线程上执行代码,请执行以下操作

// create your thread    
dispatch_queue_t queue = dispatch_queue_create("My Other Queue", 0);

// execute your synchronous block on the thread you've just created
dispatch_sync(queue,^{

  // add your implementation here to be executed on your separate thread




  dispatch_sync(dispatch_get_main_queue()^{

   // update your UI here. Don't forget you can only update UI on the main thread

  });

});