Swift 2を使用してiOSアプリケーションを作成していますが、アカウントのプロフィール写真をRealmデータベースにローカルに保存したいと思います。ドキュメントやそれについて話している人は見つかりません。
出来ますか?そしてどうやって?
それをするのは悪いのでしょうか?
画像はNSData
として保存できます。ローカルに保存する画像のURLがある場合、これを実現するコードスニペットを以下に示します。
class MyImageBlob {
var data: NSData?
}
// Working Example
let url = NSURL(string: "http://images.Apple.com/v/home/cb/images/home_evergreen_hero_iphone_medium.jpg")!
if let imgData = NSData(contentsOfURL: url) {
var myblob = MyImageBlob()
myblob.data = imgData
let realm = try! Realm()
try! realm.write {
realm.add(myblob)
}
}
ルールは簡単です。画像のサイズが小さく、画像の数が少なく、ほとんど変更されない場合は、データベースに保存することをお勧めします。
多数の画像がある場合は、それらをファイルシステムに直接書き込み、画像のパスをデータベースに保存することをお勧めします。
以下にその方法を示します。
class MyImageStorage{
var imagePath: NSString?
}
let url = NSURL(string: "http://images.Apple.com/v/home/cb/images/home_evergreen_hero_iphone_medium.jpg")!
if let imgData = NSData(contentsOfURL: url) {
// Storing image in documents folder (Swift 2.0+)
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let writePath = documentsPath?.stringByAppendingPathComponent("myimage.jpg")
imgData.writeToFile(writePath, atomically: true)
var mystorage = MyImageStorage()
mystorage.imagePath = writePath
let realm = try! Realm()
try! realm.write {
realm.add(mystorage)
}
}
注意:両方のコードサンプルは、多くの落とし穴があるため、画像をダウンロードするための信頼できる方法ではありません。実世界のアプリ/実稼働環境では、 AFNetworking または AlamofireImage のようなこの目的のためのライブラリを使用することをお勧めします。
ProblemSloverのソリューションはSwift 2.2で更新されました:
重要な注意:唯一の変更点は、Swift 2.1の時点でstringByAppendingPathComponent
が削除されたため、次のエラーが表示されることです。
stringByAppendingPathComponentは使用できません:代わりにNSURLでURLByAppendingPathComponentを使用してください。
迷惑かもしれませんが、理由により削除されているため、代わりにNSURLを使用するようAppleの推奨事項に従う必要があることに注意してください。 [〜#〜] but [〜#〜]このソリューションを続行したい場合、Swift 2.1+の修正は明示的にdocumentsPath
からNSString
へ:
class MyImageStorage{
var imagePath: NSString?
}
let url = NSURL(string: "http://images.Apple.com/v/home/cb/images/home_evergreen_hero_iphone_medium.jpg")!
if let imgData = NSData(contentsOfURL: url) {
//Explicitly cast to NSString
let documentsPath = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString)
let writePath = documentsPath.stringByAppendingPathComponent("myimage.jpg")
imgData.writeToFile(writePath, atomically: true)
var mystorage = MyImageStorage()
mystorage.imagePath = writePath
let realm = try! Realm()
try! realm.write {
realm.add(mystorage)
}
}