post Image
[Swift] UserDefaults に画像を保存するとフリーズした

リリース後のアプリに、フリーズしたり落ちたりする現象が起きる

インストール直後はサクサクと動いているけど、しばらく使っているうちにフリーズし始めるようでした。画面遷移後や、他のアプリから戻ってきたタイミング、画像を保存するタイミングでフリーズすることが時々あり、その頻度は高まっていきます。すると、アプリを閉じることもできず何もできない、というひどい状況に・・・。そしてしばらく待つと落ちます。

常に同じタイミングでフリーズするという訳でもないので、原因を掴むのに時間を要してしまいました。

解決策

色々と試した結果、以下を変更したことでフリーズすることはなくなりました。

(変更前)UIImage を UserDefaults に保存

UserDefaults に3種類の型(String型、Int型、データ型にキャストした UIImage)が混在した Any 型の配列を、配列に入れて保存していました。

var menuArray = [[Any]]()
let img = UIImage(named: "example")!
let menu = ["menuA", 3, ["menuA", 3, UIImagePNGRepresentation(img)! as NSData] as [Any]
menuArray.append(menu)

let ud = UserDefaults.standard
ud.set(menuArray, forKey: "menuArray")

(変更後)UIImage を DocumentsDirectory に保存

UIImage を DocumentsDirectory に保存して、そのファイル名のみを UserDefaults へ保存しました。さらに、Any 型の配列をやめて、辞書型に変更しました。


// ファイルを保存するURLを返す
func getDocumentsDirectory() -> URL {
  let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
  let documentsDirectory = paths[0]
  return documentsDirectory
}

// ファイルに画像を保存する
func saveImageToDocumentsDirectory(image: UIImage, name: String) {
  if let data = UIImagePNGRepresentation(image) {
      let filename = getDocumentsDirectory().appendingPathComponent(name)
      try? data.write(to: filename)
  }
}

let img = UIImage(named: "example")!
saveImageToDocumentsDirectory(image: img, name: "menuImageX.png")

var menuList = [[String: String]]()
var menu = ["name": "menuA", "point": "3", "fileName": "menuImageX.png"
]
menuList.append(menu)

結論

保存する画像枚数は、インストール時は10枚程度から始まり、ユーザーが保存すると何枚でも保存できます。ただ、アプリの内容からして、大体のユーザーは50枚以内に収まると思います。どの程度からフリーズしやすくなるかは分かりませんが、30枚程度でもフリーズしていたので、画像を UserDefaults に保存することは避けた方が良さそうです。

(参考)


『 Swift 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。