Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7648493
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 31, 20262026-05-31T10:43:46+00:00 2026-05-31T10:43:46+00:00

Update 18/3 #2. I’ve started counting beginUpdates and EndUpdates to make sure they’re even.

  • 0

Update 18/3 #2. I’ve started counting beginUpdates and EndUpdates to make sure they’re even. Right before there’s an exception, they get out of sync. Not sure why though.

UPDATE 18/3: I think I’ve found the problem, but I’m not sure if I know how to fix it. After experimenting for a couple hours, I found I could only crash the app when I had selected more than one item in the master tableview of the svc during that session.
When another item is selected in the master tableview, the detail table view gets a new object set and refreshtables is called EVEN IF it’s halfway through an update/move/delete/insert cycle. Hence the problem; I think it has instructions to update the old story object even though a new story object has been set on the detailviewcontroller.

How can I get the animation/coredata/tableview updates to be processed completely before a new story is set in the detail view? I save changes to the managedObjectContext when setEditting == NO. I’m guessing I need to make a custom setStory setter that processes all the updates to the UITableView/CoreData set before accepting the new object?

This code gets called on the master tableview controller of the svc in didSelectRowAtIndexPath:

[detailViewController setStory:storySet]; //where storySet is the new story object
[detailViewController refreshTables];

I have intermittent errors on attempting to delete the row where action won’t animate and the application essentially hangs with the following error (the row is deleted from the CoreData set though). This happens if I have chosen more than one row from the master tableview controller in the svc in one session.

After some googling I thought it might be a problem with (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id) which is called after an update to animate the changes the user has made.

How can I fix these intermittent bugs?

  • 16/3I’ve tried to really simplify my code. I’ve removed all calls to the Managed Object Context and put them in setEditing, removed superfluous [self.tableview reloadData] and [self.tableview setneedsdisplay] and invalidated the ‘reordering’ bool completely (it’s still in the code, but it’s always set to NO, so it makes no difference). The UITableView is more stable then ever, but I still manage to get intermittent errors on delete (and occasionally on add) – it seems to take a while to crash but it still will.**
  • 15/3: I think that it has something to do with the CoreData / UITableView being out of sync – CoreData thinks it has less or more than the UITableView
  • There’s no problem with the CoreData set, it’s just the animation/UI side of things (things get removed)
  • It’s intermittent, only on some deletes
  • After some help from railwayparade I implemented NSFetchedResultsChangeMove in didChangeObject: which fixed the moving error but not the delete errors.

Can anyone see anything I’ve missed or that I can check? Happy to give more information if that helps solve the problem.

Apologies for the obscene amount of code posted here.

The Error:

CoreData: error: Serious application error. An exception was caught
from the delegate of NSFetchedResultsController during a call to
-controllerDidChangeContent:. attempt to insert row 3 into section 0, but there are only 3 rows in section 0 after the update with userInfo
(null)

//
//  MakeSentenceTableViewController.h
//  StoryBot
//
//  Created by Glen Storey on 25/10/10.
//  Copyright 2010 Glen Storey. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "AddStoryItem.h"
#import "Story.h"
#import "Sentence.h"


@interface MakeSentenceTableViewController : UITableViewController <NSFetchedResultsControllerDelegate, AddStoryItemDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UITextFieldDelegate, UIPopoverControllerDelegate> {
    NSManagedObjectContext      *managedObjectContext;  
    NSFetchedResultsController  *fetchedResultsController;
    UIPopoverController         *popoverController;
    UIBarButtonItem             *playButtonItem;
    UIBarButtonItem             *addButtonItem;

    BOOL                        reordering;
    BOOL                        insert;
    BOOL                        delete;
    BOOL                        move;

    int                         beginUpdatesCount;
    int                         endUpdatesCount;

}
@property (nonatomic, retain)   Story *story;
@property (nonatomic, retain)   NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain)   UIBarButtonItem *playButtonItem;
@property (nonatomic, retain)   UIBarButtonItem *addButtonItem;
@property BOOL reordering,  insert,  delete,  move;

-(IBAction)createStoryModal:(id)sender;
-(void)refreshTables;
-(IBAction)pushShare:(id)sender;


@end


//
//  MakeSentenceTableViewController.m
//  
//
//  Created by Glen Storey on 25/10/10.
//  Copyright 2010 Glen Storey. All rights reserved.
//

#import "MakeSentenceTableViewController.h"
#import "ShareViewController.h"
#import "StoryBotAppDelegate.h"

@implementation MakeSentenceTableViewController
@synthesize story, managedObjectContext, addButtonItem, playButtonItem, reordering, insert, delete, move;

-(void)addStoryItemAction:(NSString*)text order:(NSNumber*)order image:(NSString*)image thumb:(NSString*)thumb{

    NSLog(@"Text: %@, Order: %@, Image: %@.", text, order, image);
    NSLog(@"beginUpdatesCount: %d vs. endUpdatescount: %d", beginUpdatesCount, endUpdatesCount);

    NSSet *sentences = [story sentences];
    NSNumber *maxOrder = [sentences valueForKeyPath:@"@max.order"];
    NSLog(@"maxOrder: %@", maxOrder);

    if(maxOrder == 0){

        maxOrder = [[NSNumber alloc] initWithInteger: 0];
    }

    //make a new sentence!
    Sentence *sentence = [NSEntityDescription insertNewObjectForEntityForName:@"Sentence" 
                                                       inManagedObjectContext:managedObjectContext];

    [sentence setText: text];
    [sentence setImage: image];
    [sentence setThumb: thumb];
    [sentence setBelongsTo: story];
    if([maxOrder intValue] >= 1 ){
            [sentence setOrder: [[NSNumber alloc] initWithInteger:[maxOrder intValue]+1]]; 
    }else{
            [sentence setOrder: [[NSNumber alloc] initWithInteger:1]];
    }
    NSMutableSet *mutableSet = [[NSMutableSet alloc] initWithSet:sentences];
    [mutableSet addObject:sentence];

    //NSLog(@"sentences before setWithSet %@", mutableSet);

    sentences = [[NSSet alloc] initWithSet: mutableSet];

    //NSLog(@"sentences after setWithSet %@", sentences); 

    [story setSentences:sentences];

    //NSError *error;  

    //BOOL isSaved = [managedObjectContext save:&error];
    //NSLog(@"isSaved? %@", (isSaved ? @"YES" :@"NO ") );

    //if (!isSaved) {
        //NSLog(@"%@:%s Error saving context: %@", [self class], _cmd, [error localizedDescription]);
        //Don't worry about this warning - just rem it out when finished (just a log)
      //  return;
    //} 

    [sentences release];
    [mutableSet release];

    //[self.tableView reloadData];
    //[self.tableView setNeedsDisplay];
    [self dismissModalViewControllerAnimated:YES];  



}

#pragma mark -
#pragma mark View lifecycle

-(id)initWithNibName:(NSString*)name bundle:(NSBundle*)bundle;
{
    self = [super initWithNibName:name bundle:bundle];

    if (self) {

        self.title = @"My Stories";

        addButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
                                                                                       target:self
                                                                                       action:@selector(createStoryModal:)];

        playButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPlay 
                                                                                        target:self
                                                                                        action:@selector(pushShare:)];
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
            [addButtonItem setEnabled:NO];
            [playButtonItem setEnabled:NO];
        }


        NSArray* toolbarItems = [NSArray arrayWithObjects:
                                 addButtonItem,
                                 [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace 
                                                                               target:nil
                                                                               action:nil],
                                 playButtonItem,
                                 nil];

        [toolbarItems makeObjectsPerformSelector:@selector(release)];
        self.toolbarItems = toolbarItems;  

        //NSLog(@"self: %@ self.toolbarItems: %@", self, self.toolbarItems);


        //Do I need to release UIBarButtonItems? 

        NSLog(@"initWithNibName:");
    }



    return self;
}

-(void)refreshTables{

    //use this to refresh for new table content. Also calls self.tableview reloadData so you don't need to call it afterward. 

    NSLog(@"===================================refreshTables");
    NSLog(@"story object %@", story);

    if (managedObjectContext == nil) 
    { 
        NSLog(@"managedObjectContext == nil");
        managedObjectContext = [(StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
        NSLog(@"After managedObjectContext: %@",  managedObjectContext);
    }else{
        NSLog(@"managedObjectContext != nil");
    }



    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Sentence" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];

    //sorting stuff:
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"order" ascending: YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor, nil];
    [request setSortDescriptors:sortDescriptors];
    [sortDescriptors release];
    [sortDescriptor release];

    NSPredicate *predicateTitle = [NSPredicate predicateWithFormat:@"belongsTo=%@",story];
    [request setPredicate :predicateTitle];

    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss"];
    NSString *dateString = [dateFormatter stringFromDate:[story creationDate]];

    NSLog(@"dateString: %@", dateString);

    fetchedResultsController = [[NSFetchedResultsController alloc] 
                                initWithFetchRequest:request managedObjectContext:managedObjectContext 
                                sectionNameKeyPath:nil cacheName:dateString];

    fetchedResultsController.delegate = self;

    [request release];

    NSError *error;
    [fetchedResultsController performFetch:&error];

    [self.tableView reloadData];

}

- (void)viewDidLoad {
    [super viewDidLoad];

    self.title = @"My Story";

    NSLog(@"Passed Story Object: %@", story);
    //NSLog(@"managedObjectContext: %@", managedObjectContext); 
    //Need a predicate for belongsTo here.

    self.tableView.rowHeight = 50;

    if(story != NULL){
        if (managedObjectContext == nil) 
        { 
            NSLog(@"managedObjectContext == nil");
            managedObjectContext = [(StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
            NSLog(@"After managedObjectContext: %@",  managedObjectContext);
        }else{
            NSLog(@"managedObjectContext != nil");
        }



        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Sentence" inManagedObjectContext:managedObjectContext];
        [request setEntity:entity];

        //sorting stuff:
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"order" ascending: YES];
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor, nil];
        [request setSortDescriptors:sortDescriptors];
        [sortDescriptors release];
        [sortDescriptor release];

        NSPredicate *predicateTitle = [NSPredicate predicateWithFormat:@"belongsTo=%@",story];
        [request setPredicate :predicateTitle];



        fetchedResultsController = [[NSFetchedResultsController alloc] 
                                    initWithFetchRequest:request managedObjectContext:managedObjectContext 
                                    sectionNameKeyPath:nil cacheName:nil];

        fetchedResultsController.delegate = self;

        [request release];

        NSError *error;
        [fetchedResultsController performFetch:&error];




    }



#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 1;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    //Return the number of rows in the section.
    NSArray *sections = [fetchedResultsController sections];
    NSInteger count = 0;

    if ([sections count]){
        id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:section];
        count = [sectionInfo numberOfObjects];

    }
    NSLog(@"# of rows in section %d", count);
    return count;

}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...

    Sentence *sentenceAtCell = [fetchedResultsController objectAtIndexPath:indexPath];
    //NSLog(@"sentenceAtCell: %@", sentenceAtCell);

    cell.textLabel.text = [sentenceAtCell text];



    NSArray *paths       = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *uniquePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:[sentenceAtCell thumb]];


    // This should crop it as you want - you've just got to create cropRect.

    UIImage *largeImage = [UIImage imageWithContentsOfFile: uniquePath];
    CGRect cropRect = CGRectMake(0, 0, 66, 50); 


    /*if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
        if ([[UIScreen mainScreen] scale] == 2) {
            // running an iPhone 4 or equiv. res device.
            cropRect = CGRectMake(15, 14, 100, 75); 
        }
    }*/


    CGImageRef imageRef = CGImageCreateWithImageInRect([largeImage CGImage], cropRect);
    cell.imageView.image = [UIImage imageWithCGImage: imageRef];
    CGImageRelease(imageRef);



    //NSLog(@"indexPath: %@", indexPath);

    return cell;
}

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {

        NSLog(@"Delete row");
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
        NSString *documentsDirectoryPath = [paths objectAtIndex:0];


        //  1. Look at the sentence we're about to delete.
        Sentence *sentenceRetire =      [fetchedResultsController objectAtIndexPath:indexPath];
        //  2. Does it have an order of 0? 
        NSLog(@"=================== sentenceRetire: %@", sentenceRetire);


        if([[sentenceRetire order] intValue] == 0){
                //      YES: Is there another sentence in this story?
                Story *storyRetire                      = [sentenceRetire belongsTo];
                NSSet *sentencesInRetiredSentenceSet    = [storyRetire sentences];


                if ([sentencesInRetiredSentenceSet count] > 1){
                    //          YES:    Set the sentence with the smallest order to an order of 0   
                    //                  then delete the sentence + files

                    NSPredicate *predicateTitle             = [NSPredicate predicateWithFormat:@"order>0"];
                    NSSet *sentencesWithPotentialToBeTitle  = [sentencesInRetiredSentenceSet filteredSetUsingPredicate:predicateTitle];
                    NSNumber *minOrder                      = [sentencesWithPotentialToBeTitle valueForKeyPath:@"@min.order"];  

                    NSPredicate *predicateOrder             = [NSPredicate predicateWithFormat:@"order=%d",[minOrder intValue]];
                    NSSet *sentenceWithPotentialToBeTitle   = [sentencesWithPotentialToBeTitle filteredSetUsingPredicate:predicateOrder];   

                    //note the sentence (singular) not sentences. This is the sentence who's order needs to be updated.     
                    NSLog(@"setenceWithPotentialToBeTitle (check order isn't null on crash): %@", sentenceWithPotentialToBeTitle);  
                    Sentence *sentenceToPromote = [sentenceWithPotentialToBeTitle anyObject];

                    //now we know which sentence to promote we can delete the sentence & Files.     
                    [managedObjectContext deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];

                    NSString *imageTrash = [documentsDirectoryPath stringByAppendingPathComponent:(NSString*)[sentenceRetire image]];
                    NSString *thumbTrash = [documentsDirectoryPath stringByAppendingPathComponent:[sentenceRetire thumb]];

                    NSLog(@"About to delete these files: %@, %@", imageTrash, thumbTrash);

                    [fileManager removeItemAtPath:imageTrash error:NULL];
                    [fileManager removeItemAtPath:thumbTrash error:NULL];

                    //and promote the new title.    
                    [sentenceToPromote setOrder:[[NSNumber alloc] initWithInteger:0]];



                }else{
                    //          NO:     We're deleting this story
                    //                  Delete the files! 
                    [managedObjectContext deleteObject:storyRetire]; 
                    NSString *imageTrash = [documentsDirectoryPath stringByAppendingPathComponent:(NSString*)[sentenceRetire image]];
                    NSString *thumbTrash = [documentsDirectoryPath stringByAppendingPathComponent:[sentenceRetire thumb]];

                    //NSLog(@"About to delete these files: %@, %@", imageTrash, thumbTrash);

                    [fileManager removeItemAtPath:imageTrash error:NULL];
                    [fileManager removeItemAtPath:thumbTrash error:NULL];

                //Pop back. 
                    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {      
                        NSLog(@"last sentence in story - delete that story and point, somewhere!");
                        //probably delete the sentece to clear the table, then delete the story using storyRetire

                    } else{
                        [self.navigationController popViewControllerAnimated:YES];
                    }
            }

        }else{
        //  NO: Delete the Sentence Object. 
            [managedObjectContext deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];

            NSString *imageTrash = [documentsDirectoryPath stringByAppendingPathComponent:(NSString*)[sentenceRetire image]];
            NSString *thumbTrash = [documentsDirectoryPath stringByAppendingPathComponent:[sentenceRetire thumb]];

            //NSLog(@"About to delete these files: %@, %@", imageTrash, thumbTrash);

            [fileManager removeItemAtPath:imageTrash error:NULL];
            [fileManager removeItemAtPath:thumbTrash error:NULL];

        }


        // Save the context.
        //NSError *error;
        //if (![managedObjectContext save:&error]) {
            /*
             Replace this implementation with code to handle the error appropriately.

             abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
             */
        //  NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        //  abort();
        //}

    }

}


- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated];
    if (!editing) {
        //save here
        NSError *error;
        BOOL isSaved = [managedObjectContext save:&error];
        NSLog(@"isSaved? %@ ======================================", (isSaved ? @"YES" :@"NO ") );
    }
}


// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
    //this implementation is from here: http://www.cimgf.com/2010/06/05/re-ordering-nsfetchedresultscontroller/

    NSMutableArray *things = [[fetchedResultsController fetchedObjects] mutableCopy];

    // Grab the item we're moving.
    NSManagedObject *thing = [fetchedResultsController objectAtIndexPath:fromIndexPath];

    // Remove the object we're moving from the array.
    [things removeObject:thing];
    // Now re-insert it at the destination.
    [things insertObject:thing atIndex:[toIndexPath row]];

    // All of the objects are now in their correct order. Update each
    // object's displayOrder field by iterating through the array.


    int i = 0;
    for (NSManagedObject *mo in things)
    {
        [mo setValue:[NSNumber numberWithInt:i++] forKey:@"order"];
    }


    NSLog(@"things: %@", things);
    [things release], things = nil; 

    //reordering = YES;
    //NSLog(@"moveRowAtIndexPath: IS reordering");
    //NSError *error;  
    //[managedObjectContext save:&error];   




}



#pragma mark -
#pragma mark Table view delegate
/**
 Delegate methods of NSFetchedResultsController to respond to additions, removals and so on.
 */

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {

    // The fetch controller is about to start sending change notifications, so prepare the table view for updates.
    NSLog(@"controllerWillChangeContent: BeginUpdates");

    [self.tableView beginUpdates];

    beginUpdatesCount++;
    NSLog(@"====================beginUpdates was just incremented");
    NSLog(@"beginUpdatesCount %d", beginUpdatesCount);
    NSLog(@"endUpdatesCount   %d", endUpdatesCount);

}


- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {

    NSLog(@"didChangeObject: %@", anObject);

    UITableView *tableView;
    tableView = self.tableView;

    switch(type) {
        case NSFetchedResultsChangeInsert:
            NSLog(@"ResultsChangeInsert:");
            insert = YES;
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];

            break;

        case NSFetchedResultsChangeDelete:
            NSLog(@"ResultsChangeDelete:");
            delete = YES;
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

            break;

        case NSFetchedResultsChangeMove:
            NSLog(@"ResultsChangeMove:");
            move = YES;
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationNone];
            break;

        default:
            NSLog(@"switch problem - default");
    }

}

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {

    NSLog(@"didChangeSection:");
    switch(type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        }
}


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {

    NSLog(@"didChangeContent");
    // The fetch controller has sent all current change notifications, so tell the table view to process all updates.
    NSLog(@"almost endUpdates==============================================");
    if(delete){
        NSLog(@"endUpdates delete");
        delete = NO;
    }
    if(move){
        NSLog(@"endUpdates move");
        move = NO;
    }
    if(insert){
        NSLog(@"endUpdates insert");
        insert = NO;
    }

    [self.tableView endUpdates];
    endUpdatesCount++;

    NSLog(@"====================endUpdates was just incremented");
    NSLog(@"endUpdatesCount   %d", endUpdatesCount);
    NSLog(@"beginUpdatesCount %d", beginUpdatesCount);

    NSLog(@"endUpdates finished");

}


#pragma mark -
#pragma mark Memory management

- (void)dealloc {
    NSLog(@"Dealloc Sentence");
    //[fliteEngine stopTalking];
    //[fliteEngine release];
    addButtonItem   = nil;
    playButtonItem  = nil;

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
        //It doesn't seem to get allocated because it's not set on the iPhone. 
        [addButtonItem  release];
        [playButtonItem release];
    }

    [story release];
    [fetchedResultsController release];

    [super dealloc];
}


@end
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-31T10:43:47+00:00Added an answer on May 31, 2026 at 10:43 am

    Update 18/3 #3 I read this question about a fetchedResultsController needing to have its delegate set to nil before creating a new one. I put

    detailViewController.fetchedResultsController = nil;
    detailViewController.fetchedResultsController.delegate = nil;
    

    in the SVC master view on didselectrowatindexpath and the problem has stopped. RefreshTables created a new fetchedResultsController every time a row was selected in the master view, and I think they were still interfering even when a new story object was selected.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Update: giving a much more thorough example. The first two solutions offered were right
Update: Now that it's 2016 I'd use PowerShell for this unless there's a really
UPDATE: An idea to make built-in strings non-iterable was proposed on python.org in 2006
UPDATE: Thanks for the answers! I can't seem to figure it out, even with
Update: It's not really necessary to remove added scripts considering once they run you
Update: I add a while to get the remain data, problem solved. thanks you
UPDATE: It Is Now Working I was able to finally get it completed. A
Update 2022 There is cloud sql proxy now: https://cloud.google.com/sql/docs/mysql/sql-proxy#how-works Old Question I am currently
Update: Solved, with code I got it working, see my answer below for the
Update: Check out this follow-up question: Gem Update on Windows - is it broken?

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.