開發(fā)過程中遇到的一些小問題裸影。
這兩天做濾鏡的代碼兜粘,總是會概率性出現(xiàn)全局動畫失效的情況污朽。stackOverFlow 和 cocoaChina搜索了一下,得出結(jié)論可能是非主線程調(diào)用UI所致凯砍。仔細(xì)檢查了一遍代碼,并沒有在非主線程調(diào)用UI,注釋加斷點拴竹,最后發(fā)現(xiàn)是在非主線程對image設(shè)置了濾鏡所致悟衩。代碼如下:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_queue_t syncqueue = dispatch_queue_create("com.snapsliderfilters.app",nil);
dispatch_apply(filters.count, queue, ^(size_t index){
SNFilter *filterComputed = [originalImage applyFilter:filters[index]];
dispatch_sync(syncqueue, ^{
[finalFilters addObject:filterComputed];
return;
});});
- (SNFilter*)applyFilter:(NSString*)filterName
{
SNFilter*filter = [selfcopy];
filter.name= filterName;
if(![self.filterNameListcontainsObject:filterName]) {
NSLog(@"這個濾鏡不存在");
returnfilter;
}elseif([filterNameisEqualToString:@"No Filter"]) {
returnfilter;
}else{
CIImage*sourceImage = [[CIImagealloc]initWithCGImage:filter.image.CGImageoptions:nil];
CIFilter*myFilter = [CIFilterfilterWithName:filterName];
[myFiltersetDefaults];
[myFiltersetValue:sourceImageforKey:kCIInputImageKey];
CIContext*context = [CIContextcontextWithOptions:nil];
CGImageRefoutputCGImage = [contextcreateCGImage:myFilter.outputImagefromRect:myFilter.outputImage.extent];
UIImage* filteredImage = [UIImageimageWithCGImage:outputCGImage];
filter.image= filteredImage;
returnfilter;
}
returnnil;
}
其實這些ui并沒有顯示在屏幕上。因此渲染UI一定要在主線程不止是指顯示在屏幕上的栓拜,也指ui的離屏處理座泳。(會不會是線程安全問題?線程不安全最多造成數(shù)據(jù)錯亂幕与,而不應(yīng)該是動畫失效挑势。也不很確定,對蘋果底層動畫渲染機(jī)制了解的不夠多啦鸣。)
處理方法:簡單粗暴薛耻,直接for
for(inti =0; i < filters.count; i++) {
SNFilter*filterComputed = [originalImageapplyFilter:filters[i]];
[finalFiltersaddObject:filterComputed];
}