Core data 加载视图后,UITableView中的单元格变为空白

Core data 加载视图后,UITableView中的单元格变为空白,core-data,uitableview,Core Data,Uitableview,我从web服务调用数据,将其存储到CoreData中,然后将其放入用于填充tableview的数组中。加载视图时,我将删除CoreData中实体中的所有数据,因为来自web服务的数据将频繁更新,并且可能来自多个平台。如果没有delete代码,除了旧数据会在CoreData中积累外,其他一切都可以正常工作,但是当我实现deleteEntityData调用时,我在模拟器上看到了这种奇怪的事情。数据出现,然后立即消失,就像在加载tableview之前和之后调用删除代码一样。通过NSLogs检查,代码似

我从web服务调用数据,将其存储到CoreData中,然后将其放入用于填充tableview的数组中。加载视图时,我将删除CoreData中实体中的所有数据,因为来自web服务的数据将频繁更新,并且可能来自多个平台。如果没有delete代码,除了旧数据会在CoreData中积累外,其他一切都可以正常工作,但是当我实现deleteEntityData调用时,我在模拟器上看到了这种奇怪的事情。数据出现,然后立即消失,就像在加载tableview之前和之后调用删除代码一样。通过NSLogs检查,代码似乎以正确的顺序触发,至少根据NSLogs,删除代码不会触发两次

这里是一个链接到一个屏幕,这样你就可以看到我在模拟器上看到的东西

my tableview中主要方法的代码如下:

- (void)viewDidLoad{
[super viewDidLoad];
[self setUpData];
}


- (void) deleteEntityData {

//Delete All Old Exlpore View Entities in Core Data

NSLog(@"Delete code being called");

NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setEntity:[NSEntityDescription entityForName:@"HomeView" inManagedObjectContext:context]];
[fetch setIncludesPropertyValues:NO];

NSError *error = nil;
NSArray *entities = [context executeFetchRequest:fetch error:&error];
for (NSManagedObject * exploreView in entities) {
    [context deleteObject:exploreView];
}

if (![context save:&error]) {
    NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
};

[self.tableView reloadData];
}




- (void) setUpData {

//Initialize AFHTTPRequestOperationManager with Dribbble API base URL
_operationManager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://www.karmo.com/home/news"]];

[_operationManager GET:@"?user_id=XXXX" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

    //Success - Runs if connection is made and data recieved
    [self deleteEntityData];

    //Extrat parsed JSON file into objects to prepare for Core Data import -- Should verify if I can skip and go directly into Core Data
    NSManagedObjectContext *context = [self managedObjectContext];


    for (int i = 0; i < [[responseObject valueForKey:@"userBeliefs"] count]; i++) {

        NSString * type = @"user";
        NSString * userFirstName = [[[[responseObject valueForKey:@"userBeliefs"]objectAtIndex:i] valueForKey:@"user"] valueForKey:@"firstName"];
        NSString * userLastName = [[[[responseObject valueForKey:@"userBeliefs"]objectAtIndex:i] valueForKey:@"user"] valueForKey:@"lastName"];
        NSString * userID = [[[[responseObject valueForKey:@"userBeliefs"]objectAtIndex:i] valueForKey:@"user"] valueForKey:@"_id"];
        NSString * topicID = [[[[responseObject valueForKey:@"userBeliefs"]objectAtIndex:i] valueForKey:@"topic"] valueForKey:@"_id"];
        NSString * title = [[[[responseObject valueForKey:@"userBeliefs"]objectAtIndex:i] valueForKey:@"topic"] valueForKey:@"title"];
        NSString * vote = [[[responseObject valueForKey:@"userBeliefs"]objectAtIndex:i] valueForKey:@"vote"];
        NSString * voice = [[[responseObject valueForKey:@"userBeliefs"]objectAtIndex:i] valueForKey:@"voice"];
        NSString * beliefID = [[[responseObject valueForKey:@"userBeliefs"]objectAtIndex:i] valueForKey:@"_id"];
        NSNumber * nPoints = @([[[[responseObject valueForKey:@"userBeliefs"]objectAtIndex:i] valueForKey:@"nPoints"]intValue]);
        NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
        [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
        NSDate *updatedAt = [dateFormat dateFromString:[[[responseObject valueForKey:@"userBeliefs"]objectAtIndex:i] valueForKey:@"updatedAt"]];

        NSManagedObject *newHome = [NSEntityDescription insertNewObjectForEntityForName:@"HomeView" inManagedObjectContext:context];

        [newHome setValue:type forKey:@"type"];
        [newHome setValue:userFirstName forKey:@"userFirstName"];
        [newHome setValue:userLastName forKey:@"userLastName"];
        [newHome setValue:userID forKey:@"userID"];
        [newHome setValue:topicID forKey:@"topicID"];
        [newHome setValue:title forKey:@"title"];
        [newHome setValue:vote forKey:@"vote"];
        [newHome setValue:voice forKey:@"voice"];
        [newHome setValue:beliefID forKey:@"beliefID"];
        [newHome setValue:nPoints forKey:@"nPoints"];
        [newHome setValue:updatedAt forKey:@"updatedAt"];


    }


    for (int i = 0; i < [[responseObject valueForKey:@"followeeBeliefs"] count]; i++) {

        NSUInteger arrayCount = [[[responseObject valueForKey:@"followeeBeliefs"] objectAtIndex:i] count];
        NSUInteger subtract = 2;
        NSUInteger finalCount = arrayCount - subtract;

        for (int ii = 0; ii < finalCount; ii++)  {

            NSString * type = @"followee";
            NSString * followeeUserID = [[[responseObject valueForKey:@"followeeBeliefs"]objectAtIndex:i] valueForKey:@"followee"];
            NSString * connectionID = [[[responseObject valueForKey:@"followeeBeliefs"]objectAtIndex:i] valueForKey:@"_id"];
            NSString * userFirstName = [[[[[responseObject valueForKey:@"followeeBeliefs"]objectAtIndex:i] valueForKey:[@(ii) stringValue]] valueForKey:@"user"] valueForKey:@"firstName"];
            NSString * userLastName = [[[[[responseObject valueForKey:@"followeeBeliefs"]objectAtIndex:i] valueForKey:[@(ii) stringValue]] valueForKey:@"user"] valueForKey:@"lastName"];
            NSString * userID = [[[[[responseObject valueForKey:@"followeeBeliefs"]objectAtIndex:i] valueForKey:[@(ii) stringValue]] valueForKey:@"user"] valueForKey:@"_id"];
            NSString * topicID = [[[[[responseObject valueForKey:@"followeeBeliefs"]objectAtIndex:i] valueForKey:[@(ii) stringValue]] valueForKey:@"topic"] valueForKey:@"_id"];
            NSString * title = [[[[[responseObject valueForKey:@"followeeBeliefs"]objectAtIndex:i] valueForKey:[@(ii) stringValue]] valueForKey:@"topic"] valueForKey:@"title"];
            NSString * vote = [[[[responseObject valueForKey:@"followeeBeliefs"]objectAtIndex:i] valueForKey:[@(ii) stringValue]] valueForKey:@"vote"];
            NSString * voice = [[[[responseObject valueForKey:@"followeeBeliefs"]objectAtIndex:i] valueForKey:[@(ii) stringValue]] valueForKey:@"voice"];
            NSString * beliefID = [[[[responseObject valueForKey:@"followeeBeliefs"]objectAtIndex:i] valueForKey:[@(ii) stringValue]] valueForKey:@"_id"];
            NSNumber * nPoints = @([[[[[responseObject valueForKey:@"followeeBeliefs"]objectAtIndex:i] valueForKey:[@(ii) stringValue]] valueForKey:@"nPoints"]intValue]);
            NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
            [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
            NSDate *updatedAt = [dateFormat dateFromString:[[[[responseObject valueForKey:@"followeeBeliefs"]objectAtIndex:i] valueForKey:[@(ii) stringValue]] valueForKey:@"updatedAt"]];

            NSManagedObject *newHome = [NSEntityDescription insertNewObjectForEntityForName:@"HomeView" inManagedObjectContext:context];

            [newHome setValue:type forKey:@"type"];
            [newHome setValue:followeeUserID forKey:@"followeeUserID"];
            [newHome setValue:connectionID forKey:@"connectionID"];
            [newHome setValue:userFirstName forKey:@"userFirstName"];
            [newHome setValue:userLastName forKey:@"userLastName"];
            [newHome setValue:userID forKey:@"userID"];
            [newHome setValue:topicID forKey:@"topicID"];
            [newHome setValue:title forKey:@"title"];
            [newHome setValue:vote forKey:@"vote"];
            [newHome setValue:voice forKey:@"voice"];
            [newHome setValue:beliefID forKey:@"beliefID"];
            [newHome setValue:nPoints forKey:@"nPoints"];
            [newHome setValue:updatedAt forKey:@"updatedAt"];

        }

    }


    for (int i = 0; i < [[responseObject valueForKey:@"topics"] count]; i++) {

        NSString * type = @"topic";
        NSString * topicID = [[[responseObject valueForKey:@"topics"]objectAtIndex:i] valueForKey:@"_id"];
        NSString * category = [[[responseObject valueForKey:@"topics"]objectAtIndex:i] valueForKey:@"category"];
        NSString * title = [[[responseObject valueForKey:@"topics"]objectAtIndex:i] valueForKey:@"title"];
        NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
        [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
        NSDate *updatedAt = [dateFormat dateFromString:[[[responseObject valueForKey:@"topics"]objectAtIndex:i] valueForKey:@"updatedAt"]];
        NSString * eventTitle = [[[[responseObject valueForKey:@"topics"]objectAtIndex:i] valueForKey:@"lastEvent"] valueForKey:@"title"];
        NSString * eventBody = [[[[responseObject valueForKey:@"topics"]objectAtIndex:i] valueForKey:@"lastEvent"] valueForKey:@"body"];
        NSString * eventID = [[[[responseObject valueForKey:@"topics"]objectAtIndex:i] valueForKey:@"lastEvent"] valueForKey:@"_id"];
        NSDate * eventUpdatedAt = [dateFormat dateFromString:[[[[responseObject valueForKey:@"topics"]objectAtIndex:i] valueForKey:@"lastEvent"] valueForKey:@"updatedAt"]];
        NSDate * eventCreatedAt = [dateFormat dateFromString:[[[[responseObject valueForKey:@"topics"]objectAtIndex:i] valueForKey:@"lastEvent"] valueForKey:@"updatedAt"]];

        NSManagedObject *newHome = [NSEntityDescription insertNewObjectForEntityForName:@"HomeView" inManagedObjectContext:context];

        [newHome setValue:type forKey:@"type"];
        [newHome setValue:topicID forKey:@"topicID"];
        [newHome setValue:category forKey:@"category"];
        [newHome setValue:title forKey:@"title"];
        [newHome setValue:updatedAt forKey:@"updatedAt"];
        [newHome setValue:eventTitle forKey:@"eventTitle"];
        [newHome setValue:eventBody forKey:@"eventBody"];
        [newHome setValue:eventID forKey:@"eventID"];
        [newHome setValue:eventUpdatedAt forKey:@"eventUpdatedAt"];
        [newHome setValue:eventCreatedAt forKey:@"eventCreatedAt"];


    }


    NSError *error = nil;
    if (![context save:&error]) {
        NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
    }


} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    //Failure

    NSLog(@"Failed to fetch shots from Karmo API!");
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Unable to Connect"
                                                   message:@"We were not able to connect to the karmo database. Some data may be out of date."
                                                  delegate:self
                                         cancelButtonTitle:@"Ok"
                                         otherButtonTitles: nil];
    [alert show];

} ];


[self fetchData];}





- (void) fetchData {

[homeSortData removeAllObjects];
[homeTableData removeAllObjects];

// Fetch the recipes from persistent data store
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"HomeView"];
homeSortData = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];

NSSortDescriptor *dateDescriptor = [NSSortDescriptor
                                    sortDescriptorWithKey:@"updatedAt"
                                    ascending:YES];

NSMutableArray * descriptors = [[NSArray arrayWithObjects:dateDescriptor, nil]mutableCopy];
homeTableData  = [[homeSortData sortedArrayUsingDescriptors:descriptors]mutableCopy];
[self.tableView reloadData];}





- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

if ([[[homeTableData objectAtIndex:indexPath.row] valueForKey:@"type"] isEqualToString:@"topic"]) {

    HomeTopicUpdateTableViewCell *topicCell = (HomeTopicUpdateTableViewCell *) [tableView dequeueReusableCellWithIdentifier:@"Topic" forIndexPath:indexPath];


    NSDate * topicDate = [[homeTableData objectAtIndex:indexPath.row] valueForKey:@"updatedAt"];
    NSString *currentDateString;
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
    currentDateString = [dateFormat stringFromDate:[NSDate date]];
    NSDate *currentDate = [dateFormat dateFromString:currentDateString];
    NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *dayComponents = [gregorianCalendar components:NSDayCalendarUnit
                                                           fromDate:topicDate
                                                             toDate:currentDate
                                                            options:0];
    NSString *dayDifference = [NSString stringWithFormat:@"%@d", [@([dayComponents day]) stringValue]];

    [topicCell.title setText:[[homeTableData objectAtIndex:indexPath.row] valueForKey:@"title"]];
    [topicCell.days setText:dayDifference];
    [topicCell.eventTitle setText:[[homeTableData objectAtIndex:indexPath.row]valueForKey:@"eventTitle"]];

    return topicCell;

}

if ([[[homeTableData objectAtIndex:indexPath.row] valueForKey:@"type"] isEqualToString:@"user"]) {

    HomeBeliefTableViewCell *userCell = (HomeBeliefTableViewCell *) [tableView dequeueReusableCellWithIdentifier:@"User" forIndexPath:indexPath];


    NSDate * topicDate = [[homeTableData objectAtIndex:indexPath.row] valueForKey:@"updatedAt"];
    NSString *currentDateString;
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
    currentDateString = [dateFormat stringFromDate:[NSDate date]];
    NSDate *currentDate = [dateFormat dateFromString:currentDateString];
    NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *dayComponents = [gregorianCalendar components:NSDayCalendarUnit
                                                           fromDate:topicDate
                                                             toDate:currentDate
                                                            options:0];
    NSString *dayDifference = [NSString stringWithFormat:@"%@d", [@([dayComponents day]) stringValue]];
    NSString *pointCount = [[[homeTableData objectAtIndex:indexPath.row] valueForKey: @"nPoints"]stringValue];


    [userCell.title setText:[[homeTableData objectAtIndex:indexPath.row] valueForKey:@"title"]];
    [userCell.belief setText:[[homeTableData objectAtIndex:indexPath.row] valueForKey:@"voice"]];
    [userCell.points setText:pointCount];
    [userCell.profileName setText:@"Me"];
    [userCell.days setText:dayDifference];


    return userCell;


} else {

    HomeFolloweeBeliefTableViewCell *followeeCell = (HomeFolloweeBeliefTableViewCell *) [tableView dequeueReusableCellWithIdentifier:@"Followee" forIndexPath:indexPath];


    NSDate * topicDate = [[homeTableData objectAtIndex:indexPath.row] valueForKey:@"updatedAt"];
    NSString *currentDateString;
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
    currentDateString = [dateFormat stringFromDate:[NSDate date]];
    NSDate *currentDate = [dateFormat dateFromString:currentDateString];
    NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *dayComponents = [gregorianCalendar components:NSDayCalendarUnit
                                                           fromDate:topicDate
                                                             toDate:currentDate
                                                            options:0];
    NSString *dayDifference = [NSString stringWithFormat:@"%@d", [@([dayComponents day]) stringValue]];
    NSString *fullName = [NSString stringWithFormat:@"%@ %@",[[homeTableData objectAtIndex:indexPath.row] valueForKey:@"userFirstName"],[[homeTableData objectAtIndex:indexPath.row] valueForKey:@"userLastName"]];
    NSString *pointCount = [[[homeTableData objectAtIndex:indexPath.row] valueForKey: @"nPoints"]stringValue];

    [followeeCell.title setText:[[homeTableData objectAtIndex:indexPath.row] valueForKey:@"title"]];
    [followeeCell.belief setText:[[homeTableData objectAtIndex:indexPath.row] valueForKey:@"voice"]];
    [followeeCell.profileName setText:fullName];
    [followeeCell.days setText:dayDifference];


    return followeeCell;}}

似乎在网络调用的成功块中,在解析响应并将其保存在核心数据中之后,您没有调用[self.tableView reloadData]


reloadData在deleteEntityData中被调用,这就是为什么您会看到数据消失,在fetchData中,但fetchData很可能在成功块完成之前执行,因此数据尚未保存在核心数据中。如果保存到核心数据后成功阻止,则在末尾调用[self.tableView reloadData],或者在保存核心数据上下文后,将对fetchData的调用移动到成功块的末尾

添加[self.tableView reloadData]是正确的在成功块结束时fetchData调用数据不再消失:视图加载时确实出现延迟tableview为空,然后在一秒钟后弹出数据。您可以在这里看到--有什么想法吗?是的,这是因为您在从核心数据中删除数据后调用reloadData。另外,请记住,HTTP调用是异步的,HTTP调用完成后几秒钟会调用success块,这就是您看到故障的原因。要解决此问题,只需在删除数据后不要调用reloadData即可。我从delete方法中删除了重新加载tableview的调用,但在为t加载视图时仍有延迟他是第一次。在那之后,视图中的数据显示没有延迟。是的,当然,涉及到网络呼叫,总是会有一些延迟。