2016-05-26 1 views
0

私は他の人からプロジェクトを継承しており、古いバージョンのXcodeで作成されています。アップグレードすると私は修正しなければならないものがいくつか見つかりましたが、これは私にとって困っています。CoreDataの問題 - 認識できないセレクタがインスタンスに設定されています

Xcode(NSManagedObject)によって生成されたクラスを持つCoreDataモデルがあります。私はSpeakerクラスを使ってスピーカー属性を含むMeetingオブジェクトを持っています。関係は、すべての場所にあるが、会議インスタンスのスピーカーの属性を割り当てることで、最初の試行で私は、次を得る:

2016-05-26 16:32:46.276 SignMeIn[7829:316171] -[NSKnownKeysDictionary1 setSpeaker:]: unrecognized selector sent to instance 0x7a9042b0 
2016-05-26 16:32:46.288 SignMeIn[7829:316171] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSKnownKeysDictionary1 setSpeaker:]: unrecognized selector sent to instance 0x7a9042b0' 
*** First throw call stack: 
(
    0 CoreFoundation      0x033ea494 __exceptionPreprocess + 180 
    1 libobjc.A.dylib      0x02ea4e02 objc_exception_throw + 50 
    2 CoreFoundation      0x033f4253 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275 
    3 CoreFoundation      0x0332989d ___forwarding___ + 1037 
    4 CoreFoundation      0x0332946e _CF_forwarding_prep_0 + 14 
    5 SignMeIn       0x000be242 +[CoreDataManager addSpeakerWithDictionary:forMeeting:] + 1458 
    6 SignMeIn       0x000bf6b6 +[CoreDataManager insertMeetingsFromArray:] + 902 
    7 SignMeIn       0x000b7f5b -[SyncView request:hasBeenTerminatedWithSuccess:forServiceMethod:] + 2203 
    8 SignMeIn       0x0009c0f6 __91+[OnsiteAttendeeAPI callApiMethod:isPost:parametersDictionary:delegate:shouldStartRequest:]_block_invoke.101 + 118 
    9 SignMeIn       0x00070425 -[ASIHTTPRequest reportFinished] + 213 
    10 libobjc.A.dylib      0x02eb9059 -[NSObject performSelector:withObject:] + 70 
    11 Foundation       0x023eb5f8 __NSThreadPerformPerform + 323 
    12 CoreFoundation      0x032fce5f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 
    13 CoreFoundation      0x032f2aeb __CFRunLoopDoSources0 + 523 
    14 CoreFoundation      0x032f1f08 __CFRunLoopRun + 1032 
    15 CoreFoundation      0x032f1846 CFRunLoopRunSpecific + 470 
    16 CoreFoundation      0x032f165b CFRunLoopRunInMode + 123 
    17 GraphicsServices     0x04a71664 GSEventRunModal + 192 
    18 GraphicsServices     0x04a714a1 GSEventRun + 104 
    19 UIKit        0x00e64eb9 UIApplicationMain + 160 
    20 SignMeIn       0x000534f2 main + 178 
    21 libdyld.dylib      0x040aaa25 start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

マイミーティングクラスは、型スピーカー*のスピーカー属性を持っている、との.mですべてが持っています@ getter/setterを作成する動的ステートメントすべてのヘルプは大歓迎です

+ (void) addSpeakerWithDictionary: (NSDictionary *) speakerDict forMeeting: (Meeting *) aMeeting 
{ 
    int speakerID = [speakerDict[@"id"] intValue]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"identification = %d AND %@ IN meeting", speakerID, aMeeting]; 
    NSArray *speakersArray = [CoreDataManager fetchObjects:@"Speaker" withSortDescriptors:nil andPredicate:predicate]; 

    if (speakersArray.count == 0) 
    { 
     Speaker *speaker = [NSEntityDescription insertNewObjectForEntityForName:@"Speaker" inManagedObjectContext:[CoreDataManager managedObjectContext]]; 

     speaker.degree =   speakerDict[@"degree"]; 
     speaker.firstName =  speakerDict[@"firstName"]; 
     speaker.identification = @(speakerID); 
     speaker.lastName =  speakerDict[@"lastName"]; 
     speaker.preTitle =  speakerDict[@"preTitle"]; 
     speaker.version =  speakerDict[@"version"]; 

     aMeeting.speaker = speaker; 

    } 

は、ここでは、コードです。ありがとう!

編集:

+ (void) insertMeetingsFromArray: (NSArray *) meetingsArray 
{ 
    for (NSDictionary *dict in meetingsArray) 
    { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"identification = %d AND user = %@", [dict[@"id"] intValue], SessionManagerInstance.loggedUser]; 
     NSArray *meetArray = [CoreDataManager fetchObjects:@"Meeting" withSortDescriptors:nil andPredicate:predicate]; 

     if (meetArray.count) 
     { 
      Meeting *meeting = meetArray[0]; 
      [CoreDataManager addSpeakerWithDictionary:dict[@"speaker"] forMeeting:meeting]; 
     } 
     else 
      [CoreDataManager insertMeetingWithDictionary:dict]; 
    } 

    [CoreDataManager saveContext]; 
} 

とクラスで更新

+ (void) insertMeetingWithDictionary: (NSDictionary *) dict 
{ 
// NSLog(@"dict: %@", dict); 
    Meeting *meeting = [NSEntityDescription insertNewObjectForEntityForName:@"Meeting" inManagedObjectContext:[CoreDataManager managedObjectContext]]; 

    meeting.brand =   dict[@"brand"]; 
    meeting.category =  dict[@"category"]; 
    meeting.city =   dict[@"city"]; 
    meeting.closed =   @([dict[@"closed"] boolValue]); 
    meeting.date =   [Utilities dateFromDateTime:dict[@"date"]]; 
    meeting.dateString =  dict[@"dateString"]; 
    meeting.identification = @([dict[@"id"] intValue]); 
    meeting.initiative =  dict[@"initiative"]; 
    meeting.location =  dict[@"location"]; 
    meeting.notes =   dict[@"notes"]; 
    meeting.state =   dict[@"state"]; 
    meeting.timeZone =  dict[@"timeZone"]; 
    meeting.title =   dict[@"title"]; 
    meeting.type =   dict[@"type"]; 

    [meeting setUser:SessionManagerInstance.loggedUser]; 

    [CoreDataManager addOrInsertRepWithDictionary:dict[@"rep"] forMeeting:meeting]; 
    [CoreDataManager addSpeakerWithDictionary:dict[@"speaker"] forMeeting:meeting]; 
    [CoreDataManager insertGroupsFromArray:dict[@"questiongroups"] forMeeting:meeting]; 

} 

:ここでは、呼び出し方法(複数可)です

Meeting.hは(.Mで@dynamic使用)

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 

@class Attendee, Group, Rep, Speaker, User; 

@interface Meeting : NSManagedObject 

@property (nonatomic, retain) NSString * brand; 
@property (nonatomic, retain) NSString * category; 
@property (nonatomic, retain) NSString * city; 
@property (nonatomic, retain) NSNumber * closed; 
@property (nonatomic, retain) NSDate * date; 
@property (nonatomic, retain) NSString * dateString; 
@property (nonatomic, retain) NSNumber * identification; 
@property (nonatomic, retain) NSString * initiative; 
@property (nonatomic, retain) NSString * location; 
@property (nonatomic, retain) NSNumber * needsToBeSubmitted; 
@property (nonatomic, retain) NSString * notes; 
@property (nonatomic, retain) NSString * state; 
@property (nonatomic, retain) NSString * timeZone; 
@property (nonatomic, retain) NSString * title; 
@property (nonatomic, retain) NSString * transactionId; 
@property (nonatomic, retain) NSString * type; 
@property (nonatomic, retain) NSSet *attendees; 
@property (nonatomic, retain) NSSet *groups; 
@property (nonatomic, retain) Rep *rep; 
@property (nonatomic, retain) Speaker *speaker; 
@property (nonatomic, retain) User *user; 
@end 

@interface Meeting (CoreDataGeneratedAccessors) 

- (void)addAttendeesObject:(Attendee *)value; 
- (void)removeAttendeesObject:(Attendee *)value; 
- (void)addAttendees:(NSSet *)values; 
- (void)removeAttendees:(NSSet *)values; 
- (void)addGroupsObject:(Group *)value; 
- (void)removeGroupsObject:(Group *)value; 
- (void)addGroups:(NSSet *)values; 
- (void)removeGroups:(NSSet *)values; 

@end 

Speaker.h(using ).Mで@dynamic

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 


@interface Speaker : NSManagedObject 

@property (nonatomic, retain) NSString * degree; 
@property (nonatomic, retain) NSString * firstName; 
@property (nonatomic, retain) NSNumber * identification; 
@property (nonatomic, retain) NSString * lastName; 
@property (nonatomic, retain) NSString * preTitle; 
@property (nonatomic, retain) NSString * version; 
@property (nonatomic, retain) NSSet *meeting; 
@end 

@interface Speaker (CoreDataGeneratedAccessors) 

- (void)addMeetingObject:(NSManagedObject *)value; 
- (void)removeMeetingObject:(NSManagedObject *)value; 
- (void)addMeeting:(NSSet *)values; 
- (void)removeMeeting:(NSSet *)values; 

@end 
+0

問題はaMeetingオブジェクト[NSObject(NSObject)doesNotRecognizeSelector:]にあるようですが、plsはaddSpeakerWithDictionary:forMeeting:を呼び出す方法を示し、aMeetingパラメータで渡す内容を確認します。 –

+0

呼び出しメソッドで更新/編集されました。私はそれがaMeetingオブジェクトにあると思います。多分、何らかの理由でスピーカーのゲッタ/セッターが正しく生成されなかったでしょうか? – ekimneems

+0

@ekimneems:ミーティングとスピーカーのモデルクラスを投稿してください。 –

答えて

0

NSKnownKeysDictionary1の言及はほぼ確実にこの行ことを意味します

[CoreDataManager fetchObjects:@"Meeting" withSortDescriptors:nil andPredicate:predicate]; 

...が、結果の型がNSDictionaryResultTypeでフェッチ要求を行っています。つまり、meetArray[0]は辞書であり、管理オブジェクトではありません。表示されているエラーの原因となるsetSpeakerメソッドはありません。

何らかの理由でディクショナリにする必要がない限り、フェッチ要求を変更して管理オブジェクトを返すことができます。しかし、あなたはこのような辞書を使うことはできません。

+0

これはちょうどそれがクラッシュしているところです。これは私が最初に辞書の結果を取得し、それから会議を抽出する必要があると私に信じさせる。価値を得るためにどのような鍵を使うべきかを私はどのように知っていますか? – ekimneems

+0

これはうまくいった。そのリクエストからpropertiesToFetchを削除しました。管理対象オブジェクトを返すようになりました。ありがとう! – ekimneems

関連する問題