我可以获取仅在首次启动时保存的实体。如果我重新启动该应用程序,则无法获取我的实体

登上月球的人类

我的行为很怪异。首次启动该应用程序时,我执行了多个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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以配置tomcat仅在启动时启动某些Web应用程序吗?

来自分类Dev

我可以配置tomcat仅在启动时启动某些Web应用程序吗?

来自分类Dev

如果我重新启动我的应用程序,看不到HighScore

来自分类Dev

我的应用程序中的 Viewpager Activity 重新启动

来自分类Dev

如果我运行cordova应用程序,Visual Studio将停止并重新启动

来自分类Dev

我重新启动时的Alarmmanager我该如何剩余时间

来自分类Dev

应用程序在启动时崩溃,仅在我的计算机上

来自分类Dev

应用程序在启动时崩溃,仅在我的计算机上

来自分类Dev

重新启动应用程序后,为什么我的数据没有保存到CoreData?

来自分类Dev

我的应用程序启动时停止

来自分类Dev

Windows 10启动时的“我的”应用程序

来自分类Dev

我的应用程序在启动时崩溃

来自分类Dev

在按下主页按钮时重新启动我的应用程序活动

来自分类Dev

从“最近”菜单中单击而不是恢复时,如何重新启动我的应用程序?

来自分类Dev

在根环境中启动时启动应用程序,然后进行监视,如果关闭或崩溃则重新启动

来自分类Dev

应用程序重新启动时保存视图状态android

来自分类Dev

服务器重新启动后,PM2无法启动我的nodejs应用程序

来自分类Dev

重新启动时我的脚本从哪里开始

来自分类Dev

在我重新启动系统之前,某些 Ubuntu 核心应用程序不会随机启动

来自分类Dev

每次重新启动时,我都必须重新启动sshd

来自分类Dev

在系统重新启动时重新启动我的 Web 服务器

来自分类Dev

重新启动我的应用程序时,firebase 替换了我的数据

来自分类Dev

平台重新启动时实体消失

来自分类Dev

平台重新启动时实体消失

来自分类Dev

如果长时间在后台运行,为什么我的phonegap应用程序会重新启动

来自分类Dev

除非我键入命令以重新启动Postgres,否则无法启动

来自分类Dev

为什么我的更新后的应用程序仅在IOS8上启动时崩溃?

来自分类Dev

在elasticbeanstalk中,我可以使用ssh并手动重新启动(节点)应用程序吗?

来自分类Dev

如何使我的android应用程序在启动时启动然后隐藏

Related 相关文章

  1. 1

    我可以配置tomcat仅在启动时启动某些Web应用程序吗?

  2. 2

    我可以配置tomcat仅在启动时启动某些Web应用程序吗?

  3. 3

    如果我重新启动我的应用程序,看不到HighScore

  4. 4

    我的应用程序中的 Viewpager Activity 重新启动

  5. 5

    如果我运行cordova应用程序,Visual Studio将停止并重新启动

  6. 6

    我重新启动时的Alarmmanager我该如何剩余时间

  7. 7

    应用程序在启动时崩溃,仅在我的计算机上

  8. 8

    应用程序在启动时崩溃,仅在我的计算机上

  9. 9

    重新启动应用程序后,为什么我的数据没有保存到CoreData?

  10. 10

    我的应用程序启动时停止

  11. 11

    Windows 10启动时的“我的”应用程序

  12. 12

    我的应用程序在启动时崩溃

  13. 13

    在按下主页按钮时重新启动我的应用程序活动

  14. 14

    从“最近”菜单中单击而不是恢复时,如何重新启动我的应用程序?

  15. 15

    在根环境中启动时启动应用程序,然后进行监视,如果关闭或崩溃则重新启动

  16. 16

    应用程序重新启动时保存视图状态android

  17. 17

    服务器重新启动后,PM2无法启动我的nodejs应用程序

  18. 18

    重新启动时我的脚本从哪里开始

  19. 19

    在我重新启动系统之前,某些 Ubuntu 核心应用程序不会随机启动

  20. 20

    每次重新启动时,我都必须重新启动sshd

  21. 21

    在系统重新启动时重新启动我的 Web 服务器

  22. 22

    重新启动我的应用程序时,firebase 替换了我的数据

  23. 23

    平台重新启动时实体消失

  24. 24

    平台重新启动时实体消失

  25. 25

    如果长时间在后台运行,为什么我的phonegap应用程序会重新启动

  26. 26

    除非我键入命令以重新启动Postgres,否则无法启动

  27. 27

    为什么我的更新后的应用程序仅在IOS8上启动时崩溃?

  28. 28

    在elasticbeanstalk中,我可以使用ssh并手动重新启动(节点)应用程序吗?

  29. 29

    如何使我的android应用程序在启动时启动然后隐藏

热门标签

归档