我的行为很怪异。首次启动该应用程序时,我执行了多个GET
请求以下载一些数据。
我通过以下方式下载数据AFURLConnectionOperation batchOfRequestOperations
:
这是多个GET
请求的代码:
-(void)refreshData:(NSMutableArray *)mutableOperations
{
NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:mutableOperations progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
NSLog(@"%lu of %lu complete", numberOfFinishedOperations, totalNumberOfOperations);
} completionBlock:^(NSArray *operations) {
[self.delegate dataRefreshingDone];
}];
[[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO];
}
在mutableOperation中,我有一个操作来下载一些Directors
,然后在收到我的导演后,将它们保存在CoreData中:
GET
董事运作守则:
- (AFHTTPRequestOperation *)getOperationGetDirectors
{
NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/api/diretors", [NSString stringWithUTF8String:kBaseURL]]];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation.responseSerializer setAcceptableContentTypes:[operation.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
if ([[responseObject objectForKey:@"success"] intValue] == 1) {
// I GET THE MANAGED
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext* context = [appDelegate managedObjectContext];
NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Director"
inManagedObjectContext:context]];
NSMutableArray *directorsArray= [responseObject objectForKey:@"data"];
for (NSMutableDictionary *directorReceived in directorsArray) {
// Do lots of things with the context.
Director *director = (Director *)[NSEntityDescription
insertNewObjectForEntityForName:@"Director"
inManagedObjectContext:context];
NSArray *availableKeys = [[director.entity attributesByName] allKeys];
if ([propertyName isEqualToString:@"mostFamousMovie"]) {
// This case is a relationship. A director has a most famous movie.
// So we get the most famous movie thanks to the id of the movie in the JSON
NSDictionary *mostFamousMovieReceived = [mostFamousMovieReceived objectForKey:propertyName];
Movie *movie = (Movie *)[GenericCoreData getEntityById:[mostFamousMovieReceived objectForKey:@"id"] forEntityName:@"Movie"];
if (movie) {
[director setValue:movie forKey:propertyName];
}
}
else if ([availableKeys containsObject:propertyName]) {
[director setValue:[directorReceived objectForKey:propertyName] forKey:propertyName];
}
}
NSError *error;
if ([context save:&error]) {
}
}
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// ERROR HANDLING
}];
return operation;
}
保存它们之后,继续操作DirectorsViewController
(我获取了所有导演,以将它们显示在tableView上)。效果很好。
我的getEntityById
我的GenericCoreData
班
+ (NSManagedObject *)getEntityById:(id)entityId forEntityName:(NSString *)entityName
{
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext* context = [appDelegate managedObjectContext];
NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:entityName
inManagedObjectContext:context]];
NSError *error = nil;
[fetchRequest setIncludesPropertyValues:YES];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"id == %@", entityId]];
NSArray *fetchResult = [context executeFetchRequest:fetchRequest error:&error];
NSManagedObject *managedObjectFound = nil;
if (fetchResult && [fetchResult count] == 1) {
managedObjectFound = [fetchResult objectAtIndex:0];
}
return managedObjectFound;
}
在这里,我是如何提取我的导演的:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext* context = [appDelegate managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Director"
inManagedObjectContext:context];
[request setEntity:entity];
NSError *error = nil;
NSLog(@"FETCH Director IN DIRECTOR VIEW CONTROLLER = %@", [context executeFetchRequest:request error:&error]);
NSMutableArray *mutableFetchResults = [[context executeFetchRequest:request error:&error] mutableCopy];
if (error) {
// Handle the error.
}
// We set the array of directors array for the tableView
[self setDirectorsArray:mutableFetchResults];
之后...如果我重新编译,或者甚至只是通过模拟器杀死该应用程序。如果我回到我的应用程序。我的提取请求向我返回了一个空数组,或者仅包含一个Director的数组。这不可能,因为我节省了更多导演,并且在首次启动该应用程序时抓取效果很好。
经过一番研究...我想知道是否与ManagedObjectContext
...存在冲突...它是在successBlock
操作的a中执行的事实...或者我的实体之间的关系存在问题...
我检查了表,不得不编辑我的关系。他们是双向的。我只需要删除其他表中的关系,而仅将关系保留在所有者表上(基本上没有逆关系)...当然,在某些情况下,您将需要保持逆关系。这取决于您是否需要。
总而言之,如果您再次遇到这种错误,只需检查一下您的人际关系即可。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句