2017-10-12 2 views
0

メモリの問題によりドキュメントディレクトリに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つの異なるサイズの画像を作り、これらの画像を文書ディレクトリに保存しています。最後に、メインイメージをドキュメントディレクトリに保存します。 1つのイメージの保存が完了すると、メモリは解放されません。私はこれが問題だと思う。

-(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; 
} 

答えて

0

使用このコードのObjective-Cでの渦の答えをお探しの方に

輸入

  • (無効)insertImage:(UIImage *)画像intoAlbumNamed:(NSStringの*)ALBUMNAME {// は、タイトル "albumNmame" PHAssetCollectionを持っている写真のライブラリでコレクションを取得*コレクション= [自己fetchAssetCollectionWithAlbumName:アルバム名];

    (コレクション==ゼロ)の場合{// 我々は画像 [[PHPhotoLibrary sharedPhotoLibrary] performChanges挿入する前に、それを作成します "ALBUMNAME" という名前のコレクションを見つけることができなかった場合:^ { [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitleを:アルバム名]; } completionHandler:^(BOOL成功、NSError * _Nullableエラー){ if(error!= nil){ NSLog(@ "画像をアルバムに挿入するエラー:%@"、error.localizedDescription); }

    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を];

    //アルバムが存在し、そのアルバムの名前を共有していないと仮定すると、フェッチされた唯一の結果である必要があります。 fetchResult.firstObject; }

関連する問題