2014-04-13 32 views
0

我正在使用CoreData從Web服務中提取數據,然後將其放入tableview中。當視圖第一次加載數據出現在tableview中時,但在一秒之後它全部消失。這可能與刪除代碼有關(在我上傳新數據之前,我使用它來清除CoreData實體),因爲沒有該代碼的tableview工作。我已經包含了我用來設置數據的所有代碼,將它加載到表視圖中,刪除它並重新加載它。UITableView顯示數據,然後立即變爲空白

該代碼可以在下面找到...任何幫助表示讚賞。謝謝。

- (void)viewDidLoad { 

[super viewDidLoad]; 
[self findSelectedCategories]; 
[self setUpData]; 
} 


- (void) findSelectedCategories { 

NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"ExploreCat"]; 
selectedCategoriesFilter = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; 
} 




- (void) deleteEntityData { 

NSLog(@"Delete code being called"); 

NSManagedObjectContext *context = [self managedObjectContext]; 
NSFetchRequest *fetch = [[NSFetchRequest alloc] init]; 
[fetch setEntity:[NSEntityDescription entityForName:@"ExploreView" 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 { 

//Create the string with the userID for the get request here 
NSLog(@"SetUpData being called"); 

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

[_operationManager GET:@"?user_id=5332bb35c9f9550b008ed49c" 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 
    for (int i = 0; i < [[responseObject valueForKey:@"belief"] count]; i++) { 

     NSString * topicID = [[[[responseObject valueForKey:@"belief"] valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"_id"]; 
     NSString * title = [[[[responseObject valueForKey:@"belief"] valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"title"]; 
     NSString *body = [[[[responseObject valueForKey:@"belief"] valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"body"]; 
     NSString * category = [[[[responseObject valueForKey:@"belief"] valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"category"]; 
     NSNumber * nFor = @([[[[[responseObject valueForKey:@"belief"] valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"nFor"] intValue]); 
     NSNumber * nAgainst = @([[[[[responseObject valueForKey:@"belief"] valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"nAgainst"] intValue]); 
     NSNumber *totalVotes = @([nFor integerValue] + [nAgainst integerValue]); 
     NSString * vote = [[[responseObject valueForKey:@"belief"] objectAtIndex:i] valueForKey:@"vote"]; 
     NSString *beliefID = [[[responseObject valueForKey:@"belief"] objectAtIndex:i] valueForKey:@"_id"]; 
     NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
     [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"]; 
     NSDate *createdAt = [dateFormat dateFromString:[[[[responseObject valueForKey:@"belief"] valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"createdAt"]]; 
     NSDate *updatedAt = [dateFormat dateFromString:[[[[responseObject valueForKey:@"belief"] valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"updatedAt"]]; 


     NSManagedObjectContext *context = [self managedObjectContext]; 
     // Create a new managed object 
     NSManagedObject *newExplore = [NSEntityDescription insertNewObjectForEntityForName:@"ExploreView" 
                    inManagedObjectContext:context]; 


     [newExplore setValue:topicID forKey:@"topicID"]; 
     [newExplore setValue:title forKey:@"title"]; 
     [newExplore setValue:body forKey:@"body"]; 
     [newExplore setValue:category forKey:@"category"]; 
     [newExplore setValue:nFor forKey:@"nFor"]; 
     [newExplore setValue:nAgainst forKey:@"nAgainst"]; 
     [newExplore setValue:vote forKey:@"vote"]; 
     [newExplore setValue:totalVotes forKey:@"totalVotes"]; 
     [newExplore setValue:beliefID forKey:@"beliefID"]; 
     [newExplore setValue:createdAt forKey:@"createdAt"]; 
     [newExplore setValue:updatedAt forKey:@"updatedAt"]; 


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


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

     NSString * topicID = [[[responseObject valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"_id"]; 
     NSString * title = [[[responseObject valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"title"]; 
     NSString *body = [[[responseObject valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"body"]; 
     NSString * category = [[[responseObject valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"category"]; 
     NSNumber * nAgainst = @([[[[responseObject valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"nAgainst"] intValue]); 
     NSNumber * nFor = @([[[[responseObject valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"nFor"] intValue]); 
     NSNumber *totalVotes = @([nFor integerValue] + [nAgainst integerValue]); 
     NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
     [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"]; 
     NSDate *createdAt = [dateFormat dateFromString:[[[responseObject valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"createdAt"]]; 

     NSManagedObjectContext *context = [self managedObjectContext]; 
     // Create a new managed object 
     NSManagedObject *newExplore = [NSEntityDescription insertNewObjectForEntityForName:@"ExploreView" 
                    inManagedObjectContext:context]; 


     [newExplore setValue:topicID forKey:@"topicID"]; 
     [newExplore setValue:title forKey:@"title"]; 
     [newExplore setValue:body forKey:@"body"]; 
     [newExplore setValue:category forKey:@"category"]; 
     [newExplore setValue:nFor forKey:@"nFor"]; 
     [newExplore setValue:nAgainst forKey:@"nAgainst"]; 
     [newExplore setValue:totalVotes forKey:@"totalVotes"]; 
     [newExplore setValue:createdAt forKey:@"createdAt"]; 

     NSError *error = nil; 
     // Save the object to persistent store 
     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 { 

NSLog(@"FetchData being called"); 

[exploreSortData removeAllObjects]; 
[exploreTableData removeAllObjects]; 
self.timeSortButton.backgroundColor = [UIColor clearColor]; 
self.voteSortButton.backgroundColor = [UIColor lightGrayColor]; 
NSMutableArray *subPredicates = [[NSMutableArray alloc] init]; 

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

//Would probably need to call the category slelctions here. Use an if statment to capture so if non are seletced that all the categories are displayed 

if ([selectedCategoriesFilter count] > 0) { 

    for (int i = 0; i < [selectedCategoriesFilter count]; i++) { 
     NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"category ==[c] %@",[[selectedCategoriesFilter objectAtIndex:i]valueForKey:@"categorySelected"]]; 
     [subPredicates addObject:newPredicate]; 

    } 


    NSPredicate *combinedPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates]; 

    NSArray *filterData = [[NSArray alloc]init]; 
    filterData = [exploreSortData filteredArrayUsingPredicate:combinedPredicate]; 

    NSSortDescriptor *voteDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"totalVotes" ascending:NO]; 

    NSMutableArray * descriptors = [[NSArray arrayWithObjects:voteDescriptor, nil]mutableCopy]; 
    exploreTableData = [[filterData sortedArrayUsingDescriptors:descriptors]mutableCopy]; 
    [self.tableView reloadData]; 


} else { 

    NSSortDescriptor *voteDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"totalVotes" ascending:NO]; 

    NSMutableArray * descriptors = [[NSArray arrayWithObjects:voteDescriptor, nil]mutableCopy]; 
    exploreTableData = [[exploreSortData sortedArrayUsingDescriptors:descriptors]mutableCopy]; 
    [self.tableView reloadData]; 


}} 



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

if ([[[exploreTableData objectAtIndex:indexPath.row] valueForKey:@"beliefID"] isEqualToString:@"0"]) { 

    ExploreVoteCell *cell = (ExploreVoteCell *) [tableView dequeueReusableCellWithIdentifier:@"ExploreVote" forIndexPath:indexPath]; 


    NSDate * topicDate = [[exploreTableData objectAtIndex:indexPath.row] valueForKey:@"createdAt"]; 
    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 *voteCount = [[[exploreTableData objectAtIndex:indexPath.row] valueForKey: @"totalVotes"]stringValue]; 


    [cell.topicTitle setText:[[exploreTableData objectAtIndex:indexPath.row] valueForKey:@"title"]]; 
    [cell.votesCount setText:voteCount]; 
    [cell.timeDayCount setText:dayDifference]; 

    return cell; 

} else { 

    ExploreBeliefCell *cell = (ExploreBeliefCell *) [tableView dequeueReusableCellWithIdentifier:@"ExploreBelief" forIndexPath:indexPath]; 

    UISwipeGestureRecognizer *gesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRightChangeVote:)]; 
    gesture.direction = UISwipeGestureRecognizerDirectionRight; 
    [cell addGestureRecognizer:gesture]; 

    [cell.topicTitle setText:[[exploreTableData objectAtIndex:indexPath.row] valueForKey:@"title"]]; 

    return cell; 

}} 

回答

0

我的第一個猜測是你的保存調用不會以某種方式同步。嘗試添加您的deleteEntityData方法一個完成塊,將觸發該過程的其餘部分。

您可以使用 -

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(modalDidChange:) name:NSManagedObjectContextObjectsDidChangeNotification object:yourManagedObjectContext]; 

,然後實現 -

- (void)modalDidChange:(NSNotification *)note 
{ 
    NSSet *updatedObjects = [[note userInfo] objectForKey:NSUpdatedObjectsKey]; 
    NSSet *deletedObjects = [[note userInfo] objectForKey:NSDeletedObjectsKey]; 
    NSSet *insertedObjects = [[note userInfo] objectForKey:NSInsertedObjectsKey]; 

} 

跟蹤什麼是你的背景下發生的。

+0

我在上面加上了'modalDidChange'代碼的上面的代碼塊,當我的'tableview'出現時我仍然看到同樣的東西出現。檢查我的日誌,看起來'deleteEntityData'在'setUpData'和'fetchData'之後被調用。但是,如果我在將'setUpData'中的delete方法調用到'viewDidLoad'時調用該方法,則該方法會按照正確的順序觸發(查看NSLog),但數據甚至不會出現在tableview中。思考? –

+0

你說你給deleteEntityData添加了一個完成塊,那麼在setUpData之後如何完成?順便說一句,你爲什麼不使用fetchedResultsController? – shannoga

+0

我相信這只是因爲我在該方法中使用了NSLog。但是向'modalDidChange'方法中添加一個NSLog,它看起來像是在正確的'CoreData'對象上調用了刪除代碼,但之後再次調用它,並返回一堆'null'值。就'fetchedResultsController'而言,我沒有理由沒有使用它,除此之外,我對iOS編程並不熟悉,並且可能更適合使用數組。你認爲轉換它可以幫助解決問題嗎? –