2013-01-03 22 views
9

Tôi đang gặp sự cố lớn khi phát triển ứng dụng iphone của mình.CoreData: lỗi: Lỗi ứng dụng nghiêm trọng. Đã xảy ra ngoại lệ trong khi xử lý thay đổi Dữ liệu cốt lõi

đây có đầy đủ các lỗi:

CoreData: error: Serious application error. Exception was caught during Core Data 
change processing. This is usually a bug within an observer of 
NSManagedObjectContextObjectsDidChangeNotification. -[TimeSpentStudying coordinate]: 
unrecognized selector sent to instance 0x21db92d0 with userInfo (null) 

Đây là kỳ lạ bởi vì tôi có hai thực thể CoreData (Địa điểm & TimeSpentStudying). Nhưng tôi không nghĩ đó là những vấn đề. [TimeSpentStudying coordinate] là lạ, bởi vì tôi không có một tài sản coordinate gửi vào lớp dữ liệu TimeSpentStudying lõi

Tôi có một MapView thiết lập, và khi người dùng chạm vào nút tiết lộ chi tiết về một mkannotationview, một cái nhìn mới (LibraryTrackTimeViewController) pops lên, nhưng là khá nhiều không sử dụng được. Tôi đã thử gọi NSLog trong viewDidLoad và không có gì xuất hiện.

mapViewController.m

#pragma mark - NSNotification 

- (void)contextDidChange:(NSNotification *)notification 
{ 
    if ([self isViewLoaded]) { 
    [self updateLocations]; 
} 

.

- (void)updateLocations 
{ 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Location" inManagedObjectContext:self.managedObjectContext]; 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:entity]; 

NSError *error; 
NSArray * foundObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
    if (foundObjects == nil) { 
    FATAL_CORE_DATA_ERROR(error); 
    return; 
    } 

    if (locations != nil) { 
    [self.mapView removeAnnotations:locations]; 
    } 

locations = foundObjects; 
[self.mapView addAnnotations:locations]; 

}

-(void)dealloc 
{ 
[[NSNotificationCenter defaultCenter] removeObserver:self 
    name:NSManagedObjectContextObjectsDidChangeNotification 
    object:self.managedObjectContext]; 
} 

lỗi tôi nghĩ rằng có thể phải làm với các phương pháp prepareForSegue trong mapViewController.m

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if (distance < 500) { 
    if ([segue.identifier isEqualToString:@"TrackLibraryTimes"]) { 
    UINavigationController *navigationController = segue.destinationViewController; 

LibraryTrackTimeViewController *controller = (LibraryTrackTimeViewController *)navigationController.topViewController; 
controller.managedObjectContext = self.managedObjectContext; 
    } 
}} 

Tôi xin lỗi vì cú pháp thô, tôi chỉ làm quen để SO, nếu bạn cần thêm bất kỳ mã nào, vui lòng cho tôi biết, cảm ơn tất cả.

+0

Xin chào và chào mừng! Ngoài ra, câu hỏi tuyệt vời! – doge

+3

Thông báo lỗi nêu rõ rằng thông điệp 'tọa độ' được gửi đến một thể hiện của' TimeSpentStudying', có lẽ là đối tượng có địa chỉ 0x21db92d0. Vì vậy, tại một số thời điểm bạn đang làm việc với một đối tượng 'TimeSpentStudying' trong đó một kiểu khác (' Locations'?) Được mong đợi. Do độ phân giải phương thức động trong Objective-C, các vấn đề như vậy thường chỉ được tiết lộ khi chạy. Bạn nên cố gắng xác định vấn đề, ví dụ: bằng cách đặt một điểm ngắt trên tất cả các ngoại lệ của Objective-C. –

Trả lời

1

Tùy thuộc vào độ phức tạp của dự án của bạn, cách nhanh chóng để nắm bắt điều này là triển khai phương pháp vi phạm và đặt điểm ngắt tại đó. Khi bạn nhấn điểm ngắt, bạn có thể thấy nơi nó được gọi, và chú của Bob.

Vì vậy, bạn có thể đặt một cái gì đó giống như

- (CLLocationCoordinate2D)coordinate{ 
    // set a breakpoint on the next line 
    NSParameterAssert(false); 
    return nil; 
} 

trong lớp TimeSpentStudying của bạn và xem nơi nó được gọi.

Chỉ cần đảm bảo bạn xóa nó khi bạn hoàn tất.

-3

Rất nhiều thứ tôi sẽ thử.

  1. Xóa ứng dụng khỏi trình mô phỏng và xóa ứng dụng rồi chạy lại.

  2. Nhìn mã của bạn, tôi cảm thấy bạn đang truyền xung quanh managedContextObject từ bộ điều khiển này sang bộ điều khiển khác, không cần thực hiện điều đó. Người dùng AppDelegate sharedInstance để nhận managedObject bất cứ khi nào bạn muốn. Nó sẽ không tạo ra nhiều trường hợp, nó là một đối tượng đơn.

Hãy thử hai điều này và hy vọng, bạn có thể tìm thấy một số câu trả lời hoặc có thể khắc phục được.

+1

Bình chọn b/c bạn thực sự không bao giờ muốn làm điều đó với Dữ liệu cốt lõi, và luôn luôn vượt qua MOC bằng cách sử dụng phương pháp "vượt qua dùi cui" mà Apple đề xuất. – bpapa

4

tôi đã cùng một lỗi, do

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

case NSFetchedResultsChangeInsert: 
      //[self.tableView insert 
      NSLog(@"change insert"); 
      [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 
      break; 

tôi đã sử dụng indexPath thay vì newIndexPath.

+0

Cảm ơn Doug, bạn đã cứu thịt xông khói của tôi –

2

Khắc phục sự cố bằng cách deallocating bộ điều khiển kết quả tìm nạp. Nó vẫn đang thực hiện tìm nạp như tôi đã thêm/chỉnh sửa các đối tượng trong một màn hình riêng biệt.

Các vấn đề liên quan