Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 601 - Multiple Managed Object Contextsチュートリアル 6

少し複雑なプロジェクトになると理解に時間がかかる中年オヤジの理解力の悪さが露呈してます(^_^;)

ゆっくり下記のチュートリアルを続けています。

www.raywenderlich.com

昨日の続きです。遅延格納型プロパティ「psc」を定義しているクロージャの中をみます。

lazy var psc: NSPersistentStoreCoordinator = {
 let coordinator = NSPersistentStoreCoordinator(
   managedObjectModel: self.managedObjectModel)
 let url =
 self.applicationDocumentsDirectory
  .URLByAppendingPathComponent(self.seedName + ".sqlite")
// まだまだクロージャは続きます...

話は2日前に戻りますが、copyItemAtURLメソッドで指定したコピー先のNSURL型の「url」はここで宣言されています。

「self.applicationDocumentsDirectory」は... 「applicationDocumentsDirectory」もCoreDataStack.swiftが持っているプロパティなので全体を見回すと、コードの前半で宣言されていました。

lazy var applicationDocumentsDirectory: NSURL = {
  let urls = NSFileManager.defaultManager().URLsForDirectory(
   .DocumentDirectory, inDomains: .UserDomainMask)
  return urls[urls.count-1]
}()

このプロパティも遅延格納型プロパティで、型は「NSURL」です。Documentsディレクトリの位置情報(NSURL)を、NSFileManagerクラスのメソッド「URLsForDirectory()」を使って習得しています。下記のように「Documents」フォルダにデータベースを書き込む準備をしています。

f:id:yataiblue:20160302151402j:plain

defaultManager()の存在理由

私のような無学の初心者が疑問に思っていることがあります。上記のクロージャ内部のコードは以下の3パターンで記述することができるのですが、どのパターンがいいのかはっきり分かりません。私自身はパターン1だと思っていますが、チュートリアルはパターン2です。他に調べるとパターン3も散見します。

// パターン1
  lazy var applicationDocumentsDirectory: NSURL = {
    let fm = NSFileManager.defaultManager()
    let urls = fm.URLsForDirectory(
      .DocumentDirectory, inDomains: .UserDomainMask)
    return urls[urls.count-1]
    }()

// パターン2
  lazy var applicationDocumentsDirectory: NSURL = {
    let urls = NSFileManager.defaultManager().URLsForDirectory(
      .DocumentDirectory, inDomains: .UserDomainMask)
    return urls[urls.count-1]
    }()

// パターン3
  lazy var applicationDocumentsDirectory: NSURL = {
    let urls = NSFileManager().URLsForDirectory(
      .DocumentDirectory, inDomains: .UserDomainMask)
    return urls[urls.count-1]
    }()

ファイルの操作を司るため、シングルトン・パターンのインスタンスを1つだけ生成させるのが望ましいためパターン1が安全だと思います。しかし、何度も使い回す必要がないためパターン2でもいいんでしょう。パターン3も見うけますが、ディレクトリ情報を得るためだけならシングルトンのインスタンスを生成させる必要はないかもしれません。クラスプロパティのみ使用するというスタンスでいいんでしょうか? この3つのパターンが説明できる人がいらっしゃれば教えてくださいm(_ _)m

今日はここまで。