App crashes with error:
*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x21481c10> was mutated while being enumerated.'
This happen only if I move over mapview when my annotations is loading. If I doesn't touch map, no error occurred.
- (void) startloading
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
                   ^{
                       [self loadPList];
                   });
}
my code is:
- (void) loadPList
{
@autoreleasepool {
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *path = [[documentPaths lastObject] stringByAppendingPathComponent:@"test.plist"];
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
    NSMutableArray *annotations = [[NSMutableArray alloc]init];
            NSMutableArray * annotationsToRemove = [ mapView.annotations mutableCopy ] ;
            [ annotationsToRemove removeObject:mapView.userLocation ] ;
            [ mapView removeAnnotations:annotationsToRemove ] ;
        if ([[NSUserDefaults standardUserDefaults] boolForKey:@"blackKey"])
        {
            NSArray *ann = [dict objectForKey:@"Black"];
            for(int i = 0; i < [ann count]; i++) {
                NSString *coordinates = [[ann objectAtIndex:i] objectForKey:@"Coordinates"];
                double realLatitude = [[[coordinates componentsSeparatedByString:@","] objectAtIndex:1] doubleValue];
                double realLongitude = [[[coordinates componentsSeparatedByString:@","] objectAtIndex:0] doubleValue];
                MyAnnotation *myAnnotation = [[MyAnnotation alloc] init];
                CLLocationCoordinate2D theCoordinate;
                theCoordinate.latitude = realLatitude;
                theCoordinate.longitude = realLongitude;
                myAnnotation.coordinate=CLLocationCoordinate2DMake(realLatitude,realLongitude);        
                myAnnotation.title = [[ann objectAtIndex:i] objectForKey:@"Name"];
                myAnnotation.subtitle = [[ann objectAtIndex:i] objectForKey:@"Address"];
                myAnnotation.icon = [[ann objectAtIndex:0] objectForKey:@"Icon"];
                [mapView addAnnotation:myAnnotation]; // SIGNAL SIGABRT
                [annotations addObject:myAnnotation];
            }
        }   
        if ([[NSUserDefaults standardUserDefaults] boolForKey:@"blueyellowKey"])
        {
            NSArray *ann = [dict objectForKey:@"BlueYellow"];
            for(int i = 0; i < [ann count]; i++) {
                NSString *coordinates = [[ann objectAtIndex:i] objectForKey:@"Coordinates"];
                double realLatitude = [[[coordinates componentsSeparatedByString:@","] objectAtIndex:1] doubleValue];
                double realLongitude = [[[coordinates componentsSeparatedByString:@","] objectAtIndex:0] doubleValue];
                MyAnnotation *myAnnotation = [[MyAnnotation alloc] init];
                CLLocationCoordinate2D theCoordinate;
                theCoordinate.latitude = realLatitude;
                theCoordinate.longitude = realLongitude;
                myAnnotation.coordinate=CLLocationCoordinate2DMake(realLatitude,realLongitude);        
                myAnnotation.title = [[ann objectAtIndex:i] objectForKey:@"Name"];
                myAnnotation.subtitle = [[ann objectAtIndex:i] objectForKey:@"Address"];
                myAnnotation.icon = [[ann objectAtIndex:0] objectForKey:@"Icon"];
                [mapView addAnnotation:myAnnotation];
                [annotations addObject:myAnnotation];              
            }
        }   
   }
}
				
                        
I think you should change your
loadPlistmethod to this, and then just call[self loadPlist]to invoke it:This performs the IO work of reading in the annotations in the background, and then passes off the UI work back to the main thread. Hope this helps!