NSFetchedResultsController controller didChange delegate - assertion failure










0















I built a tableview, with FRC to show data from core-data. I also implemented the controller didChange delegate, to view the changes in the core-data:



 func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) 

switch (type)
case .insert:
if indexPath != nil && (indexPath?.row)! < (controller.fetchedObjects?.count)!
tableView.insertRows(at: [indexPath!], with: .left)

break;

case .update:
if indexPath != nil && (indexPath?.row)! < (controller.fetchedObjects?.count)!
self.tableView.reloadRows(at: [indexPath!], with: .left)

break;

case .delete:
if indexPath != nil && (indexPath?.row)! < (controller.fetchedObjects?.count)!
self.tableView.deleteRows(at: [indexPath!], with: .left)

break;

case .move:
if indexPath != nil && (indexPath?.row)! < (controller.fetchedObjects?.count)!
print("type.move: shouldn't get in here!")

break;





when I run I got this on the console:




*** Assertion failure in -[UITableView _endCellAnimationsWithContext:] CoreData: error: Serious application error. An exception was caught
from the delegate of NSFetchedResultsController during a call to
-controllerDidChangeContent:. Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section
after the update (216) must be equal to the number of rows contained
in that section before the update (215), plus or minus the number of
rows inserted or deleted from that section (0 inserted, 0 deleted) and
plus or minus the number of rows moved into or out of that section (0
moved in, 0 moved out). with userInfo (null)




although the app doesn't crash - but the tableview is screwed and doesn't show the date.










share|improve this question



















  • 1





    Seems you’ve updated the data (model) via the controller but you’ve not updating the view. I would be useful to see your code in the delegate method controllerDidChangeContent to help identify the issue.

    – andrewbuilder
    Nov 14 '18 at 10:23















0















I built a tableview, with FRC to show data from core-data. I also implemented the controller didChange delegate, to view the changes in the core-data:



 func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) 

switch (type)
case .insert:
if indexPath != nil && (indexPath?.row)! < (controller.fetchedObjects?.count)!
tableView.insertRows(at: [indexPath!], with: .left)

break;

case .update:
if indexPath != nil && (indexPath?.row)! < (controller.fetchedObjects?.count)!
self.tableView.reloadRows(at: [indexPath!], with: .left)

break;

case .delete:
if indexPath != nil && (indexPath?.row)! < (controller.fetchedObjects?.count)!
self.tableView.deleteRows(at: [indexPath!], with: .left)

break;

case .move:
if indexPath != nil && (indexPath?.row)! < (controller.fetchedObjects?.count)!
print("type.move: shouldn't get in here!")

break;





when I run I got this on the console:




*** Assertion failure in -[UITableView _endCellAnimationsWithContext:] CoreData: error: Serious application error. An exception was caught
from the delegate of NSFetchedResultsController during a call to
-controllerDidChangeContent:. Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section
after the update (216) must be equal to the number of rows contained
in that section before the update (215), plus or minus the number of
rows inserted or deleted from that section (0 inserted, 0 deleted) and
plus or minus the number of rows moved into or out of that section (0
moved in, 0 moved out). with userInfo (null)




although the app doesn't crash - but the tableview is screwed and doesn't show the date.










share|improve this question



















  • 1





    Seems you’ve updated the data (model) via the controller but you’ve not updating the view. I would be useful to see your code in the delegate method controllerDidChangeContent to help identify the issue.

    – andrewbuilder
    Nov 14 '18 at 10:23













0












0








0








I built a tableview, with FRC to show data from core-data. I also implemented the controller didChange delegate, to view the changes in the core-data:



 func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) 

switch (type)
case .insert:
if indexPath != nil && (indexPath?.row)! < (controller.fetchedObjects?.count)!
tableView.insertRows(at: [indexPath!], with: .left)

break;

case .update:
if indexPath != nil && (indexPath?.row)! < (controller.fetchedObjects?.count)!
self.tableView.reloadRows(at: [indexPath!], with: .left)

break;

case .delete:
if indexPath != nil && (indexPath?.row)! < (controller.fetchedObjects?.count)!
self.tableView.deleteRows(at: [indexPath!], with: .left)

break;

case .move:
if indexPath != nil && (indexPath?.row)! < (controller.fetchedObjects?.count)!
print("type.move: shouldn't get in here!")

break;





when I run I got this on the console:




*** Assertion failure in -[UITableView _endCellAnimationsWithContext:] CoreData: error: Serious application error. An exception was caught
from the delegate of NSFetchedResultsController during a call to
-controllerDidChangeContent:. Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section
after the update (216) must be equal to the number of rows contained
in that section before the update (215), plus or minus the number of
rows inserted or deleted from that section (0 inserted, 0 deleted) and
plus or minus the number of rows moved into or out of that section (0
moved in, 0 moved out). with userInfo (null)




although the app doesn't crash - but the tableview is screwed and doesn't show the date.










share|improve this question
















I built a tableview, with FRC to show data from core-data. I also implemented the controller didChange delegate, to view the changes in the core-data:



 func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) 

switch (type)
case .insert:
if indexPath != nil && (indexPath?.row)! < (controller.fetchedObjects?.count)!
tableView.insertRows(at: [indexPath!], with: .left)

break;

case .update:
if indexPath != nil && (indexPath?.row)! < (controller.fetchedObjects?.count)!
self.tableView.reloadRows(at: [indexPath!], with: .left)

break;

case .delete:
if indexPath != nil && (indexPath?.row)! < (controller.fetchedObjects?.count)!
self.tableView.deleteRows(at: [indexPath!], with: .left)

break;

case .move:
if indexPath != nil && (indexPath?.row)! < (controller.fetchedObjects?.count)!
print("type.move: shouldn't get in here!")

break;





when I run I got this on the console:




*** Assertion failure in -[UITableView _endCellAnimationsWithContext:] CoreData: error: Serious application error. An exception was caught
from the delegate of NSFetchedResultsController during a call to
-controllerDidChangeContent:. Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section
after the update (216) must be equal to the number of rows contained
in that section before the update (215), plus or minus the number of
rows inserted or deleted from that section (0 inserted, 0 deleted) and
plus or minus the number of rows moved into or out of that section (0
moved in, 0 moved out). with userInfo (null)




although the app doesn't crash - but the tableview is screwed and doesn't show the date.







swift uitableview core-data delegates nsfetchedresultscontroller






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 14 '18 at 12:08







Aviram Net

















asked Nov 14 '18 at 9:32









Aviram NetAviram Net

5,53942754




5,53942754







  • 1





    Seems you’ve updated the data (model) via the controller but you’ve not updating the view. I would be useful to see your code in the delegate method controllerDidChangeContent to help identify the issue.

    – andrewbuilder
    Nov 14 '18 at 10:23












  • 1





    Seems you’ve updated the data (model) via the controller but you’ve not updating the view. I would be useful to see your code in the delegate method controllerDidChangeContent to help identify the issue.

    – andrewbuilder
    Nov 14 '18 at 10:23







1




1





Seems you’ve updated the data (model) via the controller but you’ve not updating the view. I would be useful to see your code in the delegate method controllerDidChangeContent to help identify the issue.

– andrewbuilder
Nov 14 '18 at 10:23





Seems you’ve updated the data (model) via the controller but you’ve not updating the view. I would be useful to see your code in the delegate method controllerDidChangeContent to help identify the issue.

– andrewbuilder
Nov 14 '18 at 10:23












1 Answer
1






active

oldest

votes


















0














my mistake was that on insert and update I referred to indexPath instead of newIndexPath...



it should be:



 case .insert:
if newIndexPath != nil && (newIndexPath?.row)! < (controller.fetchedObjects?.count)!
tableView.insertRows(at: [newIndexPath!], with: .left)

break;





share|improve this answer
























    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53296926%2fnsfetchedresultscontroller-controller-didchange-delegate-assertion-failure%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    my mistake was that on insert and update I referred to indexPath instead of newIndexPath...



    it should be:



     case .insert:
    if newIndexPath != nil && (newIndexPath?.row)! < (controller.fetchedObjects?.count)!
    tableView.insertRows(at: [newIndexPath!], with: .left)

    break;





    share|improve this answer





























      0














      my mistake was that on insert and update I referred to indexPath instead of newIndexPath...



      it should be:



       case .insert:
      if newIndexPath != nil && (newIndexPath?.row)! < (controller.fetchedObjects?.count)!
      tableView.insertRows(at: [newIndexPath!], with: .left)

      break;





      share|improve this answer



























        0












        0








        0







        my mistake was that on insert and update I referred to indexPath instead of newIndexPath...



        it should be:



         case .insert:
        if newIndexPath != nil && (newIndexPath?.row)! < (controller.fetchedObjects?.count)!
        tableView.insertRows(at: [newIndexPath!], with: .left)

        break;





        share|improve this answer















        my mistake was that on insert and update I referred to indexPath instead of newIndexPath...



        it should be:



         case .insert:
        if newIndexPath != nil && (newIndexPath?.row)! < (controller.fetchedObjects?.count)!
        tableView.insertRows(at: [newIndexPath!], with: .left)

        break;






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Nov 15 '18 at 9:28

























        answered Nov 15 '18 at 9:21









        Aviram NetAviram Net

        5,53942754




        5,53942754



























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53296926%2fnsfetchedresultscontroller-controller-didchange-delegate-assertion-failure%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Top Tejano songwriter Luis Silva dead of heart attack at 64

            ReactJS Fetched API data displays live - need Data displayed static

            Evgeni Malkin