具有Core数据对象的NSArray的Singleton为null

时间:2015-11-19 21:08:19

标签: ios objective-c core-data singleton

所以我有一个拥有NSArray的Singleton。该数组由核心数据获取请求中的120K +对象启动。当我通过数组访问视图控制器中的这些对象时,它们为空。它显示了正确的对象数,并且在初始化后它们在单例内部显示正常。有什么想法吗?感谢您的帮助。

Singleton.h

@interface Singleton : NSObject
@property (nonatomic, retain) NSArray *singletonArray;
+(Singleton*)singleton;
@end

Singleton.m

#import "Singleton.h"
#import "DataAccessLayer.h"

@implementation Singleton
@synthesize singletonArray;
+(Singleton *)singleton {
    static dispatch_once_t pred;
    static __strong Singleton *shared = nil;
    dispatch_once(&pred, ^{
        shared = [[Singleton alloc]init]; 
    });
    return shared;
}

-(id)init 
{
    if (self = [super init]) 
    {
        DataAccessLayer *dataAccess = [[DataAccessLayer alloc]init];
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        [fetchRequest setEntity:[NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext: dataAccess.managedObjectContext]];
        [fetchRequest setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"Name" ascending:YES]]];
        NSError *error = nil;
        self.singletonArray = [dataAccess.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    }
    return self;
}
@end

ViewController.m

#import "ViewController.h"
#import "Singleton.h"

@interface ViewController ()
@end

- (void)viewDidLoad
{
    [super viewDidLoad]; 
    FAKFontAwesome *settingsIcon = [FAKFontAwesome gearIconWithSize:22];
    [settingsIcon addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor]];
    UIImage *settingsIconImage = [settingsIcon imageWithSize:CGSizeMake(22, 22)];

    UIButton *settingsIconButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 22, 22)];
    [settingsIconButton addTarget:self action:@selector(settingsBarButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [settingsIconButton setImage:settingsIconImage forState:UIControlStateNormal];
    [self.settingsBarButton setCustomView:settingsIconButton];

    self.masterArray = [NSArray new];
    self.masterArray = [[Singleton singleton] singletonArray];

    NSString *title = [[self.masterArray objectAtIndex:0] field1];
    NSLog(@"Viewdidload: %@", title);
}

- (IBAction)settingsBarButtonClicked:(id)sender
{
    NSString *title = [[self.masterArray objectAtIndex:0] field1];
    NSLog(@"SettingsBarButtonClicked Log %@", title);
}

@end

单一控制台输出

(lldb) po [self.singletonArray count]
120441

(lldb) po [self.singletonArray objectAtIndex:0]
<MyEntity: 0x14c0628c0> (entity: MyEntity; id: 0xd00000070e740000 <x-coredata://8DAFE4F5-7218-4F6F-B32A-1BD9C056D1B9/MyEntity/p115613> ; data: {
    "field1" = "joe";
    "field2" = "doe";
})

ViewController中的控制台输出

 2015-11-19 17:51:09.188 MyApp[20299:7909725] Viewdidload: joe

 2015-11-19 17:54:36.637 MyApp[20334:7913246] SettingsBarButtonClicked Log (null)

(lldb) po [self.masterArray count]
120441

(lldb) po [self.masterArray objectAtIndex:0]
<MyEntity: 0x1366db7a0> (entity: <null>; id: 0xd00000070e740000 <x-coredata://8DAFE4F5-7218-4F6F-B32A-1BD9C056D1B9/MyEntity/p115613> ; data: <fault>)

1 个答案:

答案 0 :(得分:2)

在我看来,获取所有记录并将它们存储在内存中的数组中是一个非常糟糕的主意。基本上,它违背了数据库的目的。

我建议您使用NSFetchedResultsController来访问您的对象。您可以免费获得这么多:出色的性能,内存优化和许多其他功能,例如:用于在保存新数据时更新列表,或用于填充表格视图等。

注意:根据你的问题,似乎数组读得很好。尝试记录实际&#34; field1&#34;的内容。您的实体并检查它是否有效。