2011-11-29 17 views
56

Czy to naprawdę proste w systemie iOS5?Pobieranie danych w tle danych za pomocą nowego NSPrivateQueueConcurrencyType

kiedyś wykonać tło pobrać za pomocą tego kodu w moim AppDelegate:

dispatch_queue_t downloadQueue = dispatch_queue_create("DownloadQueue", NULL); 
dispatch_async(downloadQueue, ^{ 
     self.myDownloadClass = [[MyDownloadClass alloc]initInManagedObjectContext:self.managedObjectContext]; 
     [self.myDownloadClass download]; 
    }); 

dispatch_release(downloadQueue); 

Moja klasa pobieranie wykonuje NSURLConnection się pobrać niektórych danych XML używa NSXMLParser do analizowania danych, a następnie aktualizuje złożonego schematu w podstawowych danych. Zawsze przełączałem się na główny wątek, aby faktycznie aktualizować podstawowe dane. Kod brudny, z dużą ilością połączeń do dispatch_sync (dispatch_get_main_queue() ....

Mój nowy kod wygląda następująco:

NSManagedObjectContext *child = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
[child setParentContext:self.managedObjectContext]; 

[child performBlock:^{ 
    self.myDownloadClass = [[MyDownloadClass alloc]initInManagedObjectContext:child]; 
    [self.myDownloadClass download]; 
    }]; 

wraz z niewielką zmianą innego kodu w moim AppDelegate aby ustawić rodzic model obiektowy typ kontekstu do NSMainQueueConcurrencyType:

- (NSManagedObjectContext *)managedObjectContext 
{ 
    if (__managedObjectContext != nil) 
    { 
     return __managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) 
    { 
     __managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
     [__managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    } 
    return __managedObjectContext; 
} 

wydaje się działać bardzo dobrze cały proces aktualizacji nadal działa w osobnym wątku, ale nie trzeba utworzyć wątku wydaje się magią

...

Pamiętaj tylko, jeśli chcesz zatwierdzić zmiany w fizycznych plikach danych rdzenia, masz także zapis połączeń: w kontekście nadrzędnym.

Tak naprawdę nie zadawałem tu pytania. Publikuję to, aby pomóc innym, ponieważ wszystko, co znalazłem podczas wyszukiwania nowych metod kontekstowych obiektów zarządzanych przez iOS5, dało tylko szczegółowe informacje o wysokim poziomie bez przykładów kodu. Wszystkie inne wyszukiwania dotyczące pobierania podstawowych danych w tle są stare, czasami bardzo stare i przedyskutuj, jak to zrobić przed iOS5.

+0

czy to naprawdę takie proste? – timthetoolman

+0

dzięki za udostępnienie! – Max

+0

i po tym trzeba zapisać zmiany –

Odpowiedz

0

Próbuję zrozumieć, w jaki sposób ten nowy interfejs API jest zaimplementowany. Mój zwykły wzorzec dla wielowątkowych danych rdzenia jest coś takiego:

Zwykle w NSOperation ale uprościć stosując dispatch_async w tym przykładzie:

dispatch_queue_t coredata_queue; // some static queue 

dispatch_async(coredata_queue, ^() { 
    // get a new context for this thread, based on common persistent coordinator 
    NSManagedObjectContext *context = [[MyModelSingleton model] threadedContext]; 

    // do something expensive 

    NSError *error = nil; 
    BOOL success = [context save:&error]; 
    if (!success) { 
     // the usual. 
    } 

    // callback on mainthread using dispatch_get_main_queue(); 
}); 

Następnie główny wątek będzie reagować poprzez aktualizację interfejsu użytkownika opartego na NSManagedObjectContextDidSaveNotification scalić główny kontekst.

Nowe interfejsy API wydają się być opakowaniem dookoła tego wzoru, w którym kontekst wygląda tak, że po prostu zabiera stałego koordynatora z nadrzędnego w celu utworzenia nowego kontekstu. Podanie wartości NSPrivateQueueConcurrencyType w init spowoduje, że parametr performBlock zostanie wykonany w kolejce prywatnej.

Nowy interfejs API nie wydaje się zawierać dużo mniej kodu do wpisania. Jakieś zalety w stosunku do "tradycyjnego" gwintowania?

2

Tak - teraz jest naprawdę łatwo (w iOS 5.0). W przypadku zgodności z systemem iOS 4 poprzednie przeszkody pozostają, ale dokumentacja nie jest zbyt zła w przypadku zamknięcia nici. Może powinieneś dodać to do sekcji wiki?

Powiązane problemy