2015-08-18 37 views
19

Pracowałem przez Core Data Stack in Swift - Demystified ale kiedy dotarłem do liniiNSManagedObjectContext(): `init()` została zaniechana w iOS 9.0: Korzystanie -initWithConcurrencyType

self.context = NSManagedObjectContext() 

Dostałem ostrzeżenie

`init()` was deprecated in iOS 9.0: Use -initWithConcurrencyType: instead 

widzę, że mogę zrobić jedną z następujących czynności dla self.context =

NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.ConfinementConcurrencyType) 
NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType) 
NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType) 

ale ponieważ ConfinementConcurrencyType jest również przestarzałe, co pozostawia mi MainQueueConcurrencyType i PrivateQueueConcurrencyType. Jaka jest różnica między tymi dwoma i jak powinienem wybrać, który z nich używać? Czytam this documentation, ale tak naprawdę nie rozumiem.

+1

Może [wątek] (http://stackoverflow.com/questions/8637921/core-datas-nsprivatequeueconcurrencytype-and-sharing-objects-between -threads) pomaga. – Jens

Odpowiedz

21

Zasadniczo zawsze będziesz miał przynajmniej 1 kontekst z NSMainQueueConcurrencyType i wieloma kontekstami z NSPrivateQueueConcurrencyType. NSPrivateQueueConcurrencyType jest zwykle używany do zapisywania lub pobierania rzeczy do podstawowych danych w tle (na przykład podczas próby zsynchronizowania rekordów z usługą sieci Web).

Tworzy kontekst powiązany z główną kolejką, który idealnie nadaje się do użytku z NSFetchedResultsController.

Domyślny stos danych podstawowych używa pojedynczego kontekstu z NSMainQueueConcurrencyType, ale można utworzyć znacznie lepszą aplikację, wykorzystując wiele NSPrivateQueueConcurrencyType do wykonywania jakichkolwiek prac, które nie mają wpływu na interfejs użytkownika.

+0

Dzięki za odpowiedź. Czy mogę używać 'PrivateQueueConcurrencyType' dla wszystkich kontekstów? Zakładam, że może to spowodować dziwne zachowanie lub może spowodować awarię. – sahara108

+1

Nie powinieneś używać 'PrivateQueueConcurrencyType' dla jakichkolwiek prac, które muszą być wykonane w głównej kolejce. Powinieneś zawsze używać 'MainQueueConcurrencyType' z' NSFetchedResultsController'. 'PrivateQueueConcurrencyType' używa wątku tła, więc zachowaj ten umysł. – DBoyer

7

zastąpić te dwie funkcje w następujący:

lazy var managedObjectContext: NSManagedObjectContext = { 
    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail. 
    let coordinator = self.persistentStoreCoordinator 
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) 
    managedObjectContext.persistentStoreCoordinator = coordinator 
    return managedObjectContext 
    }() 

// MARK: - Core Data Saving support 

func saveContext() { 
    if managedObjectContext.hasChanges { 
     do { 
      try managedObjectContext.save() 
     } catch { 
      // Replace this implementation with code to handle the error appropriately. 
      // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      let nserror = error as NSError 
      NSLog("Unresolved error \(nserror), \(nserror.userInfo)") 
      abort() 
     } 
    } 
}