Po zapisaniu danych (10 rekordów) do podmiotu, jestem przetwarzania żądania pobierał, aby wszystkie dane ponownie:udało wartość obiektu jest losowo zerowy (projekt próbki w zestawie)
//Saving data
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
//Save to coredata
song = [NSEntityDescription insertNewObjectForEntityForName:@"Song"
inManagedObjectContext:context];
[song setValue:title forKey:@"title"];
[song setValue:songLink forKey:@"songWebLink"];
NSLog(@"Song link : %@",songLink);//Never get NULL
[song setValue:albumLink forKey:@"albumImageLink"];
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}else{
NSLog(@"Record saved correctly");
}
}
Zapisywanie powyżej działa poprawnie i Debugowałem bardzo uważnie wszystkie dane przed zapisaniem w kontekście, aby upewnić się, że żaden z atrybutów nie jest NULL
.
Problem jest zawsze z atrybutem songWebLink
, czasami robi się zerowa, gdy próbuję ot dostać go z powrotem poniżej:
- (void)parserDidEndDocument:(NSXMLParser *)parser{
NSEntityDescription *songEntity=[NSEntityDescription entityForName:@"Song" inManagedObjectContext:context];
NSFetchRequest *fetch=[[NSFetchRequest alloc] init];
[fetch setEntity:songEntity];
NSError *fetchError;
NSArray *fetchedSongs=[context executeFetchRequest:fetch error:&fetchError];
NSMutableArray *songs = [[NSMutableArray alloc] init];
for (NSManagedObject *songObject in fetchedSongs) {
//here is the issue: this for loop will go through 10 iterations, songWebLink is randomly NULL, sometimes it's the fourth iteration, sometimes the 8th, sometimes the 5th.
NSLog(@"song web link: %@",[songObject valueForKey:@"songWebLink"]);//albumImageLink and title attributes are fine
}
}
Kwestia jest taka, że kiedy NSLog
się songWebLink
, robi NULL, gdy dla 4. iteracja, potem 6, potem 2 itd. Przy pobieraniu losowo przypisuje wartość NULL do atrybutu. Podczas zapisywania danych upewniam się, że nie ma wartości NULL
dla songWebLink
. Więc postawię na coś innego, co jest przyczyną tego problemu.
Jakieś myśli?
EDIT
Oto jak MOC jest inicjowany:
AppDelegate.m:
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];//I tried initWithConcurrencyType:NSMainQueueConcurrencyType
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
Pierwsze MOC obiektu użyć go w innej klasie:
AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication]delegate];
context = [appDelegate managedObjectContext];
Przykładowy projekt: Jeśli uważasz, że musisz rzucić okiem na projekt aplikacji, stworzyłem uproszczoną wersję, na której powieliłem błąd, możesz go pobrać here.
Za dużo zapisujesz kontekst. Może to powoduje problem. Stworzyłem 'NSManagedObject' w' parser: didEndElement: namespaceURI: qualifiedName: 'i zapisałem je wszystkie raz w' parserDidEndDocument: '. – Desdenova
Cześć, myślałem o tym już i przetestowałem, ale też nie działało. – Malloc
Spróbuj ustawić właściwość 'songWebLink' na zakodowany ciąg znaków. Jeśli problem zniknie, przyjrzyj się bliżej faktycznym wartościom. Jedyne, co mogę wymyślić, to upewnić się, że używasz kontekstu i jego obiektów w kolejce powiązanej z kontekstem. Problemy z wątkami mogą pojawiać się losowo. –