44

iOS の写真関連アプリの中には、アプリで作成した画像をフォト ライブラリ以外の場所に保存するものがあります。たとえば、Fat Booth は、アプリの起動時にアプリで作成された写真のスクロール リストを表示します。これらの写真は、ユーザーが写真ライブラリに明示的に保存しなくても保持されることに注意してください。iOS アプリケーション内で画像を保存して永続化する最も簡単な方法は何ですか?

私がよく知っている唯一の永続ストアは、NSUserDefaults とキー チェーンです。ただし、これらが画像などのより大きなデータを保存するために使用されているとは聞いたことがありません。Core Data が最も簡単な方法であるかどうか疑問に思っています。

4

3 に答える 3

65

最も簡単な方法は、アプリの Documents ディレクトリに保存し、次のように NSUserDefaults でパスを保存することです。

NSData *imageData = UIImagePNGRepresentation(newImage);

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *imagePath =[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png",@"cached"]];

NSLog(@"pre writing to file");
if (![imageData writeToFile:imagePath atomically:NO]) 
{
    NSLog(@"Failed to cache image data to disk");
}
else
{
    NSLog(@"the cachedImagedPath is %@",imagePath); 
}

次に、imagePath を NSUserDefaults の辞書に保存するか、必要に応じて保存し、それを取得するには次のようにします。

 NSString *theImagePath = [yourDictionary objectForKey:@"cachedImagePath"];
 UIImage *customImage = [UIImage imageWithContentsOfFile:theImagePath];
于 2013-01-25T23:36:18.813 に答える
35

スイフトの場合:

let imageData = UIImagePNGRepresentation(selectedImage)
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let imagePath = paths.stringByAppendingPathComponent("cached.png")

if !imageData.writeToFile(imagePath, atomically: false)
{
   println("not saved")
} else {
   println("saved")
   NSUserDefaults.standardUserDefaults().setObject(imagePath, forKey: "imagePath")
}

スウィフト 2.1 の場合:

let imageData = UIImagePNGRepresentation(selectedImage)
let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
let imageURL = documentsURL.URLByAppendingPathComponent("cached.png")

if !imageData.writeToURL(imageURL, atomically: false)
{
    print("not saved")
} else {
    print("saved")
    NSUserDefaults.standardUserDefaults().setObject(imageData, forKey: "imagePath")
}

stringByAppendingPathComponentSwift 2.1 では使用できないため、URLByAppendingPathComponent. Get more info here を使用できます。

于 2014-11-25T10:46:40.257 に答える
7

バイナリ データを格納することでコア データを使用できますが、推奨されません。特に写真の場合は、もっと良い方法があります。アプリケーションには、アプリケーションのみがアクセスできるドキュメント/ファイル ディレクトリがあります。概念とアクセス方法については、ここから始めることをお勧めします。比較的簡単です。これをコア データと組み合わせて、ファイル パスやメタデータなどを保存することもできます

于 2013-01-25T23:30:43.617 に答える