从相机胶卷保存多个图像到文件目录由于内存问题坠毁
当我尝试保存超过10个图像到文档目录由于内存问题导致崩溃。从相机胶卷保存多个图像到文件目录由于内存问题坠毁
-(void) importArrayDictionary: (NSArray *) arrayDictionary ToFolder: (NSString *) folderDestination {
_requestOptions = [[PHImageRequestOptions alloc] init];
_requestOptions.resizeMode = PHImageRequestOptionsResizeModeExact;
_requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
_requestOptions.synchronous = true;
//kch-data
dispatch_queue_t importQueue = dispatch_queue_create("importQueue", NULL);
dispatch_async(importQueue, ^{
for(PHAsset *asset in arrayDictionary){
//dispatch_async(dispatch_get_main_queue(), ^{
[self createFileWithName: [self generateNewFileName:[self getTypeFromDictionary:asset]] Folder: folderDestination Item:asset];
//});
}
//Notify delegate
dispatch_async(dispatch_get_main_queue(), ^{
if (self.delegate != nil && [self.delegate respondsToSelector:@selector(pgDataSourceDidFinishImportingFiles:)])
[self.delegate pgDataSourceDidFinishImportingFiles: self];
});
});
}
这是我用来保存的代码。我从主图像制作3个不同大小的图像,并将这些图像保存到文档目录中。最后将主图像保存到文档目录。完成保存一个图像后,它不释放内存。我认为这是问题。
-(NSString *) createFileWithName: (NSString *) name Folder: (NSString *) folder Item: (PHAsset *) aDicItem {//kch-data
__block UIImage *_imageThumb;
//
PHImageManager *manager = [PHImageManager defaultManager];
[manager requestImageForAsset:aDicItem
targetSize:PHImageManagerMaximumSize
contentMode:PHImageContentModeDefault
options:_requestOptions
resultHandler:^void(UIImage *image, NSDictionary *info) {
_imageThumb = image;
}];
//UIImage *_imageThumb = [aDicItem objectForKey:@"UIImagePickerControllerOriginalImage"];
//Thumb110
//CGSize size = _imageThumb.size;
UIImage *thumbImage110 = [_imageThumb thumbnailImage:200 transparentBorder:0 cornerRadius:0 interpolationQuality: kCGInterpolationHigh];
//thumbImage110 = [_imageThumb imageWithImage:_imageThumb scaledToFillSize:size];
[UIImageJPEGRepresentation(thumbImage110, 0.75) writeToFile: [self getThumbnail110PathForFilename: name] atomically:YES];
//Thumb150
UIImage *thumbImage150 = [_imageThumb thumbnailImage:200 transparentBorder:0 cornerRadius:0 interpolationQuality: kCGInterpolationHigh];
[UIImageJPEGRepresentation(thumbImage150, 0.75) writeToFile: [self getThumbnail150PathForFilename: name] atomically:YES];
NSString *filePath;
NSString *folderPath = [self.itmesDir stringByAppendingPathComponent: folder];
if([[NSUserDefaults standardUserDefaults] boolForKey:FAKE_MODE]){
folderPath = [self.fakeDir stringByAppendingPathComponent: folder];
}
filePath = [folderPath stringByAppendingPathComponent: name];
NSCharacterSet *chss = [NSCharacterSet characterSetWithCharactersInString:@"'#%^&{}[]/~|\?.<,"];
NSString *dbFilename = [[name componentsSeparatedByCharactersInSet:chss] componentsJoinedByString:@""];
if(aDicItem.mediaType == 1){
[UIImageJPEGRepresentation(_imageThumb, 1.0) writeToFile: filePath atomically:YES];
NSLog(@"file path = %@",filePath);
}
//Return file path
return filePath;
}
使用此代码
对于那些寻找埃迪在Objective-C的答案。
进口
-
(无效)insertImage:(*的UIImage)图像intoAlbumNamed:(的NSString *)ALBUMNAME {// 中提取具有标题 “albumNmame” PHAssetCollection的照片库的集合* collection = [self fetchAssetCollectionWithAlbumName:albumName];
如果(集合==无){// 如果我们无法找到一个名为 “ALBUMNAME” 我们将插入图像 [PHPhotoLibrary sharedPhotoLibrary] performChanges之前创建它集合:^ { [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle :albumName]; (错误!=零)NSLog(@“错误插入图像到相册中:%@”,error.localizedDescription);}(完成处理程序:^(BOOL成功,NSError * _Nullable错误){ } }
if (success) { //Fetch the newly created collection (which we *assume* exists here) PHAssetCollection *newCollection = [self fetchAssetCollectionWithAlbumName:albumName]; [self insertImage:image intoAssetCollection: newCollection]; } }];
}其他{ //如果我们发现标题为 “ALBUMNAME” 现有AssetCollection,插入它 [自insertImage:图像intoAssetCollection:收藏] } }
-
(PHAssetCollection *)fetchAssetCollectionWithAlbumName:(的NSString *)ALBUMNAME { PHFetchOptions * FetchOptions的= [PHFetchOptions新]; //提供谓词以匹配相册的标题。 fetchOptions.predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@“title =='%@'”,albumName]];
//使用提取选项 PHFetchResult获取相册* fetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum亚型:PHAssetCollectionSubtypeAlbumRegular选项:类别FetchOptions];
//假设相册存在并且没有相册共享它的名字,它应该是唯一取得的结果 return fetchResult.firstObject; }