2016-03-26 12 views
1

私は、デバイスのGPSルートを追跡するiOSアプリケーションを作成しました。 問題は、私が5分以上を追跡しているときに、コアデータが非常に長く保存する必要があることです。 私は、セッションとセッションと呼ばれるオブジェクトを多くの場所オブジェクトを保存します。 ロケーションオブジェクトは[[緯度、経度]]コアデータは非常に遅いです。 swift

となり、セッションオブジェクトは[名前:文字列、日付:nsdate、平均速度:倍速、高速度:倍速、駆動キロメートル:倍、場所:[[ダブル、ダブル]]]

だから、5分後に動作します。それは私が2または3分を保存すると思うがかかる

+0

iOSシミュレータまたはiPhoneで作業していますか?一部のアプリを終了してメモリを消去してみてください。 – brimstone

+0

バックグラウンド保存に親コンテキストを使用してください。 –

+0

また、アプリを終了することは事態を早めるために事実上何もしません。 –

答えて

2

同じ種類の多くのオブジェクトがある場合、コアデータは自然に物事を保存するために時間がかかるだろう。あなたがしていることに関係なく、それはしばらく時間がかかります。あなたができることは、あなたのUIをフリーズさせないためにバックグラウンドスレッドで場所を取るように保存を設定することです。

最も簡単な方法は、メインコンテキストの背景コンテキストを作成することです。基本的なコンテキストでは、データを親コンテキストに保存し、親コンテキストではデータをディスクに保存するという考えがあります。

Core Data Parent and Child Contexts

メインコンテキストと親コンテキストの両方がメモリ内で実行されているので、子から親に保存操作を高速で:基本的にこのような。親にあなたのロケーションオブジェクトがあれば、それはバックグラウンドスレッドで保存されます。まだ長い時間がかかるかもしれませんが、UIをフリーズしてはいけません。

そして、あなたはこのようなあなたのコードでこれを設定することができます。

lazy var parentContext: NSManagedObjectContext = { 
    let moc = NSManagedObjectContext(concurrencyType:.PrivateQueueConcurrencyType) 
    moc.persistentStoreCoordinator = self.coordinator 
    return moc 
}() 

lazy var context: NSManagedObjectContext = { 
    let moc = NSManagedObjectContext(concurrencyType:.MainQueueConcurrencyType) 
    // moc.persistentStoreCoordinator = self.coordinator 
    moc.parentContext = self.parentContext 
    return moc 
}() 

contextは、子コンテキストになります。あなたはそれが親のコンテキストに与えることがどれほど簡単かを見ることができます。

class func save(moc:NSManagedObjectContext) { 

    moc.performBlockAndWait { 

     if moc.hasChanges { 

      do { 
       try moc.save() 
      } catch { 
       print("ERROR saving context \(moc.description) - \(error)") 
      } 
     } 

     if let parentContext = moc.parentContext { 
      save(parentContext) 
     } 
    } 
} 

(少し取られ、コードから編集「スウィフトとiOS用の学習コアデータ:ガイドハンズオン」ティム・Roadley著書)次に

は、あなたのデータを保存します。