title: Error: NSArray was mutated while being enumerated thrown when accessing globals and Core Data
body: <p>I have this piece of code which I am using to update some values in Core Data when another object is added:</p>
  
  <pre><code>//Create new receipt
          Receipt *receipt = [[Receipt alloc] init];
          receipt.project = self.projectLabel.text;
          receipt.amount = self.amountTextField.text;
          receipt.descriptionNote = self.descriptionTextField.text;
          receipt.business = self.businessNameTextField.text;
          receipt.date = self.dateLabel.text;
          receipt.category = self.categoryLabel.text;
          receipt.paidBy = self.paidByLabel.text;
          receipt.receiptImage1 = self.receiptImage1;
          //Need to set this to 2
          receipt.receiptImage2 = self.receiptImage1;
          receipt.receiptNumber = @"99";
  
          int count = 0;
          int catCount = 0;
  
      for (Project *p in appDelegate.projects)
              {
                  if ([p.projectName isEqualToString:receipt.project]){
                      double tempValue = [p.totalValue doubleValue];
                      tempValue += [receipt.amount doubleValue];
                      NSString *newTotalValue = [NSString stringWithFormat:@"%.02f", tempValue];
                      NSString *newProjectName = p.projectName;
                      //remove entity from Core Data
                      NSFetchRequest * allProjects = [[NSFetchRequest alloc] init];
                      [allProjects setEntity:[NSEntityDescription entityForName:@"Project" inManagedObjectContext:appDelegate.managedObjectContext]];
                      [allProjects setIncludesPropertyValues:NO]; //only fetch the managedObjectID
  
                      NSError * error = nil;
                      NSArray * projectsArray = [appDelegate.managedObjectContext executeFetchRequest:allProjects error:&amp;error];
  
                      //Delete product from Core Data
                      [appDelegate.managedObjectContext deleteObject:[projectsArray objectAtIndex:count]];
  
                      NSError *saveError = nil;
                      [appDelegate.managedObjectContext save:&amp;saveError];
  
                      [appDelegate.projects removeObjectAtIndex:count];
  
                      NSLog(@"Removed project from Core Data");
  
                      //Insert a new object of type ProductInfo into Core Data
                      NSManagedObject *projectInfo = [NSEntityDescription
                                                      insertNewObjectForEntityForName:@"Project" 
                                                      inManagedObjectContext:appDelegate.managedObjectContext];
  
                      //Set receipt entities values
                      [projectInfo setValue:newProjectName forKey:@"name"];
                      [projectInfo setValue:newTotalValue forKey:@"totalValue"];
  
                      if (![appDelegate.managedObjectContext save:&amp;error]) {
                          NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
                      }
  
                      NSLog(@"Added Project to Core Data");
  
                      Project *tempProject = [[Project alloc] init];
                      tempProject.projectName = [projectInfo valueForKey:@"name"];
                      tempProject.totalValue = [projectInfo valueForKey:@"totalValue"];
  
                      [appDelegate.projects addObject:tempProject];
  
                  }
                  count++;
              }
  
              for (Category *c in appDelegate.categories){
  
                  if ([c.categoryName isEqualToString:receipt.category]){
  
                      double tempValue = [c.totalValue doubleValue];
                      tempValue += [receipt.amount doubleValue];
                      NSString *newTotalValue = [NSString stringWithFormat:@"%.02f", tempValue];
                      NSString *newCategoryName = c.categoryName;
  
                      //remove entity from Core Data
                      NSFetchRequest * allCategories = [[NSFetchRequest alloc] init];
                      [allCategories setEntity:[NSEntityDescription entityForName:@"Category" inManagedObjectContext:appDelegate.managedObjectContext]];
                      [allCategories setIncludesPropertyValues:NO]; //only fetch the managedObjectID
  
                      NSError * categoriesError = nil;
                      NSArray * categoriesArray = [appDelegate.managedObjectContext executeFetchRequest:allCategories error:&amp;categoriesError];
  
                      //Delete product from Core Data
                      [appDelegate.managedObjectContext deleteObject:[categoriesArray objectAtIndex:catCount]];
                      NSError *categorySaveError = nil;
                      [appDelegate.managedObjectContext save:&amp;categorySaveError];
  
                      [appDelegate.categories removeObjectAtIndex:catCount];
  
                      NSLog(@"Removed category from Core Data");
                      NSError * error = nil;
                      //Insert a new object of type ProductInfo into Core Data
                      NSManagedObject *categoryInfo = [NSEntityDescription
                                                       insertNewObjectForEntityForName:@"Category" 
                                                       inManagedObjectContext:appDelegate.managedObjectContext];
  
                      //Set receipt entities values
                      [categoryInfo setValue:newCategoryName forKey:@"name"];
                      [categoryInfo setValue:newTotalValue forKey:@"totalValue"];
  
                      if (![appDelegate.managedObjectContext save:&amp;error]) {
                          NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
                      }
  
                      NSLog(@"Added Category to Core Data");
  
                      Category *tempCategory = [[Category alloc] init];
                      tempCategory.categoryName = [categoryInfo valueForKey:@"name"];
                      tempCategory.totalValue = [categoryInfo valueForKey:@"totalValue"];
  
                      [appDelegate.categories addObject:tempCategory];
                  }
                  catCount++;
  
              }
  </code></pre>
  
  <p>This code gives the error:</p>
  
  <p>'...was mutated while being enumerated'.</p>
  
  <p>Can anyone explain why?  Also, is there a better approach to doing what I'm trying to achieve?</p>