Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios dispatch_barrier_async不';t等待CoreImage完成处理_Ios_Multithreading_Grand Central Dispatch_Core Image_Dispatch Async - Fatal编程技术网

Ios dispatch_barrier_async不';t等待CoreImage完成处理

Ios dispatch_barrier_async不';t等待CoreImage完成处理,ios,multithreading,grand-central-dispatch,core-image,dispatch-async,Ios,Multithreading,Grand Central Dispatch,Core Image,Dispatch Async,在我问我的问题之前,我应该说我已经读了很多关于它的书,我尝试了很多方法,但都没有成功。我在一个并发队列中执行几十个核心图像处理,我需要使用dispatch_barrier_async等待它们完成,这样我才能进行最终渲染并转到下一个视图控制器,但讽刺的是,dispatch_barrier并不等待我的并发队列完成,这是为什么?是因为我在错误的线程中进行核心图像处理吗 //这是我的并发队列 dispatch_queue_t concurrentQueue = dispatch_get_global_

在我问我的问题之前,我应该说我已经读了很多关于它的书,我尝试了很多方法,但都没有成功。我在一个并发队列中执行几十个核心图像处理,我需要使用dispatch_barrier_async等待它们完成,这样我才能进行最终渲染并转到下一个视图控制器,但讽刺的是,dispatch_barrier并不等待我的并发队列完成,这是为什么?是因为我在错误的线程中进行核心图像处理吗

//这是我的并发队列

dispatch_queue_t concurrentQueue = 
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
这里使用它来处理效果作为示例

-(void)setupEffects{
//It's one of my effects as an example which renders for previewing the //effect.

case Effect4:{
              dispatch_async(concurrentQueue, ^{
                  //BG
                  self.firstCIFilter = [CIFilter filterWithName:@"CIHexagonalPixellate"
                                            withInputParameters:@{@"inputImage": [self getFirstCIImage],@"inputScale":@26}];
                  self.lastSelectedInputImgforBG =[self applyCIEffectWithCrop];

                  //FG
                  self.firstCIFilter = [CIFilter filterWithName:@"CIPhotoEffectProcess"
                                            withInputParameters:@{@"inputImage":[self getFirstCIImage]}];
                  self.fgImgWithEffect = [self applyCIEffect];

                  dispatch_async(dispatch_get_main_queue(), ^{
                      self.lastSelectedInputImgforFG= [self cropAndFadeAndRenderFGImage];
                      [self saveEffect];
                      [self loadEffectsWithIndex:effectIndex];
                  });
              });
 }

//Once user is done, it renders the image once again
-(UIImage *)applyCIEffectWithCrop{
    __weak typeof(self) weakSelf = self;
    @autoreleasepool{
        weakSelf.firstCIContext =nil;
        weakSelf.firstResultCIImage=nil;
        weakSelf.croppingCIImage=nil;

        weakSelf.firstCIContext = [CIContext contextWithOptions:nil];
        weakSelf.firstResultCIImage = [weakSelf.firstCIFilter valueForKey:kCIOutputImageKey];
        weakSelf.croppingCIImage=[weakSelf.firstResultCIImage imageByCroppingToRect:CGRectMake(0,0, weakSelf.affineClampImage1.size.width*scale , weakSelf.affineClampImage1.size.height*scale)];
        return  [UIImage imageFromCIImage:weakSelf.croppingCIImage scale:1.0 orientation:weakSelf.scaledDownInputImage.imageOrientation cropped:YES withFirstCIImage:[weakSelf getFirstCIImage]];
    }
}
然后对于我的最终渲染,此方法需要等待我的setupEffect完成,然后使用segue,但它没有

- (void)doneButtonAction {
    _finalRender =YES;
    CGFloat max=MAX(self.originalSizeInputImage.size.width,self.originalSizeInputImage.size.height);
    if (max<=1700){
        //Do nothing for Final Render
        self.scaledDownInputImage= self.originalSizeInputImage;
    }else{
        CGSize scaledDownSize = [self getScalingSizeForFinalRenderForImage: self.originalSizeInputImage];
        self.scaledDownInputImage = [self scaleThisImage:self.originalSizeInputImage scaledToFillSize:scaledDownSize];
    }
    imageRect = AVMakeRectWithAspectRatioInsideRect(self.scaledDownInputImage.size, self.viewWithLoadedImages.bounds);

    //Preparation for high quality render with high resolution input 
    //image.
    self.affineClampImage1 = [self affineClampImage];
    self.selectionCropAndBlurredImage = [self croppedFGtoGetBlurred];
    [self.imgData appendData:UIImagePNGRepresentation(self.scaledDownInputImage)];
    [self.effectClass getimageWithImageData:self.imgData];

    if (_effectMode) {
        //Applying effects again for the high resolution input image.
        [self setupEffects];
    }else{
        [self setupFilters];
    }

    dispatch_async(concurrentQueue, ^{
        //Rendering the high quality Images in full resolution here.
        CGRect frame = CGRectMake(0.0, 0.0,
                                  self.lastSelectedInputImgforBG.size.width  *self.lastSelectedInputImgforBG.scale,
                                  self.lastSelectedInputImgforBG.size.height *self.lastSelectedInputImgforBG.scale);
        UIGraphicsBeginImageContextWithOptions(frame.size, NO, 1.0);
        // Draw transparent images on top of each other
        [self.lastSelectedInputImgforBG drawInRect:frame];
        [self.lastSelectedInputImgforFG drawInRect:frame];
        self.tempImage=nil;
        self.tempImage = UIGraphicsGetImageFromCurrentImageContext();        
        UIGraphicsEndImageContext();
    });

    dispatch_barrier_async(concurrentQueue, ^{
        // Getting the full resolution rendered image and going to 
        //the next viewcontroller when the setupEffect and render is 
        //finished... which it doesn't wait until they're finished...
        self.finalHightqualityRenderedImage = self.tempImage;        
        [self performSegueWithIdentifier:@"showShareVC" sender:self];
    });
}
-(void)doneButtonAction{
_finalRender=是;
CGFloat max=max(self.originalSizeInputImage.size.width,self.originalSizeInputImage.size.height);

如果(max我认为解释在下面:

您指定的队列应该是使用dispatch\u queue\u create函数自己创建的并发队列。如果传递给此函数的队列是串行队列或全局并发队列之一,则此函数的行为类似于dispatch\u async函数

因此,不要按照您的要求抓取
调度队列\u优先级\u后台

第一行代码,使用
dispatch\u queue\u create创建
concurrentQueue

您指定的队列应该是使用dispatch\u queue\u create函数自己创建的并发队列。如果传递给此函数的队列是串行队列或全局并发队列之一,则此函数的行为类似于dispatch\u async函数

因此,不要按照您的要求抓取
调度队列\u优先级\u后台

第一行代码,创建
concurrentQueue
您自己使用
dispatch\u queue\u create

像这样?
dispatch\u queue\u t myQueue=dispatch\u queue\u create(“我的队列”,NULL)
如果我这样定义它会是并发的吗?好的,我尝试过这样做,我假设这就是你建议的
concurrentQueue=dispatch\u queue\u create(“我的队列”,dispatch\u queue\u concurrent)
不,问题仍然存在,不幸的是,它没有造成任何影响。@ClafouI引用了错误的函数--现在编辑了我的答案以更正它。我可以问一下,为什么您要对注释为“在此处以完全分辨率呈现高质量图像”的块使用dispatch_async吗,而不是dispatch\u barrier\u async?听起来这是需要等待其他块完成的块?也被上一个块弄糊涂了,因为它所做的只是UI,所以它应该在主线程上。是的,如果它需要等待,那么它需要是dispatch\u barrier\u async中的一个,这使它等待。但是你不希望在你的r上执行它结束队列时,您希望它位于主线程上。因此,只需将它添加到dispatch\u async(dispatch\u get\u main\u queue()块中的渲染块末尾。如下所示?
dispatch\u queue\t myQueue=dispatch\u queue\u create(“我的队列”,NULL)
如果我这样定义它会是并发的吗?好的,我尝试过这样做,我假设这就是你建议的
concurrentQueue=dispatch\u queue\u create(“我的队列”,dispatch\u queue\u concurrent)
不,问题仍然存在,不幸的是,它没有造成任何影响。@ClafouI引用了错误的函数--现在编辑了我的答案以更正它。我可以问一下,为什么您要对注释为“在此处以完全分辨率呈现高质量图像”的块使用dispatch_async吗,而不是dispatch\u barrier\u async?听起来这是需要等待其他块完成的块?也被上一个块弄糊涂了,因为它所做的只是UI,所以它应该在主线程上。是的,如果它需要等待,那么它需要是dispatch\u barrier\u async中的一个,这使它等待。但是你不希望在你的r上执行它结束队列时,您希望它位于主线程上。因此,只需将它添加到dispatch\u async(dispatch\u get\u main\u queue()块中呈现块的末尾。