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