[go: up one dir, main page]

View in English

  • メニューを開く メニューを閉じる
  • Apple Developer
検索
検索を終了
  • Apple Developer
  • ニュース
  • 見つける
  • デザイン
  • 開発
  • 配信
  • サポート
  • アカウント
次の内容に検索結果を絞り込む

クイックリンク

5 クイックリンク

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • トピック
  • すべてのビデオ
  • 利用方法

その他のビデオ

  • 概要
  • コード
  • Core Data: 雑件と格言

    Core DataはあなたのAppからの情報を永続的に、常に保存する主要な方法です。データをより早く読み込み、取り込むためにより良く実装する方法をこれからお見せします。必要なデータ取得をバッチ挿入、必要なデータへのカスタムフェッチ要求を使ってどう改善し、持続ストアへの変更通知に対応するかを見ていきましょう。

    このセッションを有効に活用いただくには、Core Dataの知識があり、過去に利用されたこともあることが望ましいです。フレームワークについてより詳細な情報が必要な場合には、“Making Apps with Core Data”をご参照ください。

    リソース

    • Loading and Displaying a Large Data Feed
      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC19

    • Core DataでAppを作成する
  • このビデオを検索
    • 1:48 - Batch Operations - Enable Persistent History

      storeDesc.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
    • 2:32 - NSBatchInsertRequest.h

      //NSBatchInsertRequest.h
      
      @available(iOS 13.0, *)
      open class NSBatchInsertRequest : NSPersistentStoreRequest {
          open var resultType: NSBatchInsertRequestResultType
      
          public convenience init(entityName: String, objects dictionaries: [[String : Any]])
          public convenience init(entity: NSEntityDescription, objects dictionaries: [[String : Any]])
      
          @available(iOS 14.0, *)
          open var dictionaryHandler: ((inout Dictionary<String, Any>) -> Void)?
          open var managedObjectHandler: ((inout NSManagedObject) -> Void)?
      
          public convenience init(entity: NSEntityDescription, dictionaryHandler handler: @escaping (inout Dictionary<String, Any>) -> Void)
          public convenience init(entity: NSEntityDescription, managedObjectHandler handler: @escaping (inout NSManagedObject) -> Void)
      }
    • 3:01 - Earthquakes Sample - Regular Save

      //Earthquakes Sample - Regular Save
      
         for quakeData in quakesBatch {
              guard let quake = NSEntityDescription.insertNewObject(forEntityName: "Quake", into: taskContext) as? Quake else { ... }
              do {
                  try quake.update(with: quakeData)
              } catch QuakeError.missingData {
                  ...
                  taskContext.delete(quake)
              }
              ...
          }
          do {
              try taskContext.save()
          } catch { ... }
    • 3:16 - Earthquakes Sample - Batch Insert with Array of Dictionaries

      //Earthquakes Sample - Batch Insert
      
      var quakePropertiesArray = [[String:Any]]()
      for quake in quakesBatch {
          quakePropertiesArray.append(quake.dictionary)
      }
      
      let batchInsert = NSBatchInsertRequest(entityName: "Quake", objects: quakePropertiesArray)
      
      var insertResult : NSBatchInsertResult
      do {
          insertResult = try taskContext.execute(batchInsert) as! NSBatchInsertResult
          ... 
      }
    • 3:28 - Earthquakes Sample - Batch Insert with a block

      //Earthquakes Sample - Batch Insert with a block
      
      var batchInsert = NSBatchInsertRequest(entityName: "Quake", dictionaryHandler: { 
          (dictionary) in
              if (blockCount == batchSize) {
                  return true
              } else {
                  dictionary = quakesBatch[blockCount]
                  blockCount += 1
              }
          })
          var insertResult : NSBatchInsertResult
          do {
              insertResult = try taskContext.execute(batchInsert) as! NSBatchInsertResult
              ...
          }
    • 5:42 - NSBatchInsertRequest - UPSERT

      let moc = NSManagedObjectContext(concurrencyType:
                                 NSManagedObjectContextConcurrencyType.privateQueueConcurrencyType)
          
      moc.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
      
      insertResult = try moc.execute(insertRequest)
    • 6:30 - Batch Update Example

      //Earthquakes Sample - Batch Update
      
      let updateRequest = NSBatchUpdateRequest(entityName: "Quake")
      updateRequest.propertiesToUpdate = ["validated" : true]
      updateRequest.predicate = NSPredicate("%K > 2.5", "magnitude")
      
      var updateResult : NSBatchUpdateResult
      do {
          updateResult = try taskContext.execute(updateRequest) as! NSBatchUpdateResult
          ... 
      }
    • 7:33 - Batch Delete without and with a Fetch Limit

      // Batch Delete without and with a Fetch Limit
      
         DispatchQueue.global(qos: .background).async {
             moc.performAndWait { () -> Void in
                do {
                    let expirationDate = Date.init().addingTimeInterval(-30*24*3600)
      
                    let request = NSFetchRequest<Quake>(entityName: "Quake")
                    request.predicate = NSPredicate(format:"creationDate < %@", expirationDate)
      
                    let batchDelete = NSBatchDeleteRequest(fetchRequest: request)
                    batchDelete.fetchLimit = 1000
                    moc.execute(batchDelete)
                 }
             }
         }
    • 12:18 - Fetch average magnitude of each place

      //Fetch average magnitude of each place
      
      let magnitudeExp = NSExpression(forKeyPath: "magnitude")
      let avgExp = NSExpression(forFunction: "avg:", arguments: [magnitudeExp])
      
      let avgDesc = NSExpressionDescription()
      avgDesc.expression = avgExp
      avgDesc.name = "average magnitude"
      avgDesc.expressionResultType = .floatAttributeType
      
      let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Quake")
      fetch.propertiesToFetch = [avgDesc, "place"]
      fetch.propertiesToGroupBy = ["place"]
      fetch.resultType = .dictionaryResultType
    • 13:36 - NSManagedObjectContext.h - Modernized Notifications

      //NSManagedObjectContext.h
      
      @available(iOS 14.0, *)
      extension NSManagedObjectContext {
          public static let willSaveObjectsNotification: Notification.Name
          public static let didSaveObjectsNotification: Notification.Name
          public static let didChangeObjectsNotification: Notification.Name
               
          public static let didSaveObjectIDsNotification: Notification.Name
          public static let didMergeChangesObjectIDsNotification: Notification.Name
      }
    • 13:54 - NSManagedObjectContext.h - Modernized Keys

      //NSManagedObjectContext.h
      
      @available(iOS 14.0, *)
      extension NSManagedObjectContext {
          public enum NotificationKey : String {  
              case sourceContext
              case queryGeneration
              case invalidatedAllObjects
              case insertedObjects
              case updatedObjects
              case deletedObjects
              case refreshedObjects
              case invalidatedObjects
              case insertedObjectIDs
              case updatedObjectIDs
              case deletedObjectIDs
              case refreshedObjectIDs
              case invalidatedObjectIDs
          }
      }
    • 14:08 - Enable Remote Change Notifications with Persistent History

      storeDesc.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)
      storeDesc.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
    • 16:19 - History Pointers

      let changeDesc = NSPersistentHistoryChange.entityDescription(with: moc)
      let request = NSFetchRequest<NSFetchRequestResult>()
      
      //Set fetch request entity and predicate
      request.entity = changeDesc
      request.predicate = 
          NSPredicate(format: "%K = %@",changeDesc?.attributesByName["changedObjectID"], objectID)
         
      //Set up history request with distantPast and set fetch request              
      let historyReq = NSPersistentHistoryChangeRequest.fetchHistory(after: Date.distantPast)
      historyReq.fetchRequest = request
                          
      let results = try moc.execute(historyReq)

Developer Footer

  • ビデオ
  • WWDC20
  • Core Data: 雑件と格言
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習とAI
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    Apple Developerアプリを入手する
    Copyright © 2025 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン