- データモデルに車両エンティティがあります。
- 名前、メーカー、モデルなどの属性があります。
- NewVehicleViewControllerにモーダルセグエがあり、ユーザーがエンティティ情報を入力できるようになっています。
- このセグエ中にmanagedObjectContextをNewVehicleViewControllerに渡しました
[完了]をクリックし、NewVehicleViewControllerのIBActionメソッド内からcreate + Vehicle.mのメソッドを呼び出すことにより、新しいNSEntityDescriptionを作成します。
Vehicle * car = [Vehicle VehicleWithName:name inManagedObjectContext:self.context];
このメソッドは次のことを行います。
+ (Vehicle *) vehicleWithName:(NSString *)name inManagedObjectContext:(NSManagedObjectContext *) context
{
Vehicle *vehicle = nil;
//check for duplicates
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Vehicle"];
request.predicate = [NSPredicate predicateWithFormat:@"name = %@", name];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSError *error;
NSArray *matches = [context executeFetchRequest:request error:&error];
NSLog(@"Matches: %d", matches.count);
if(!matches || [matches count] >1){
//nil or more than 1
} else if ([matches count] == 0){
//not found
vehicle = [NSEntityDescription insertNewObjectForEntityForName:@"Vehicle" inManagedObjectContext:context];
vehicle.name = name;
}else{
vehicle = [matches lastObject];
NSLog(@"vehicle already exists with name: %@", name);
}
NSLog(@"Created vehicle with name: %@", vehicle.name);
return vehicle;
}
ウィンドウを閉じてテーブルビューコントローラーに戻ると、そこに新しい要素が表示されます。(このテーブルはフェッチステートメントにリンクされています)。すべてが良いです。
次に、約4〜6秒後に、例外がスローされます。下部のデバッグログには何も表示されません。最初の行が途切れているスレッド8ビューが表示されます。
libobjc.A.dylib`objc_exception_throw:
0x1780caa: pushl %ebp
0x1780cab: movl %esp, %ebp
0x1780cad: pushl %ebx
0x1780cae: pushl %edi
0x1780caf: pushl %esi
0x1780cb0: subl $2028, %esp
0x1780cb6: calll 0x01780cbb ; objc_exception_throw + 17
だから私の最初の質問は、問題が何であるかという考えはありますか?これは、NS Core Dataの自動保存がしばらくしてから発生しているために発生していますか?
そして、私の2番目の質問は、問題が何であるかを見つけるために、これをさらにデバッグするにはどうすればよいでしょうか。
ありがとう!