0

以下は、エンティティPlayerヘッダー ファイルです。

@interface Player : NSManagedObject

@property (nonatomic, retain) NSNumber * experience;
@property (nonatomic, retain) id items;
@property (nonatomic, retain) NSNumber * level;

@end

@interface items : NSValueTransformer
@end

items基本的にNSMutableArraywithNSNumber要素です。そして、1 つの関数内で、この配列を更新しています。

- (void)itemWasDropped:(ItemIndex)item
{ // _player has been correctly retrieved from the database
    // the current number of this item
    int nNum = [[_player.items objectAtIndex:item] intValue];
    // to increment the number
    [_player.items replaceObjectAtIndex:item withObject:[NSNumber numberWithInt:nNum + 1]];
}

この関数は完全に呼び出されます。コンテキストを関数に保存しますviewWillDisappear

- (void)viewWillDisappear:(BOOL)animated
{ // _moc is an NSManagedObjectContext instance that has been correctly initialised.
    // to update the database
    NSError* err = nil;
    BOOL bSucc = [_moc save:&err];
    if (err || !bSucc)
    {
        ...
    }
}

問題は、タスク バーでアプリをシャットダウンしない限り、更新が他のビューに表示されることです。どうしたの?誰でも助けることができますか?

4

2 に答える 2

2

コア データは配列を格納できますが、「変換可能な」属性を使用する必要があります。一般的に、あまり良いデザインではありません。簡単な解決策の 1 つは、数値配列を格納できるものに変換することです。たとえば、多くの場合、文字列を使用するだけで十分です。

エンコード:

player.items = [numbers componentsJoinedByString:@","];
// Swift
player.items = numbers.joinWithSeparator(",")

デコード:

NSMutableArray* numbers = [NSMutableArray array];
for (NSString *s in [player.items componentsSeparatedByString:@","]) {
  [numbers addObject:@([s integerValue])];
}
// Swift
let numbers = player.items.characters.split { $0 == "," } .map { Int($0!) }
于 2013-10-19T10:08:59.803 に答える
0

ちょうどそれを解決しました。コア データ エンティティ内の配列属性を更新するには、その配列を@propertyビュー コントローラー クラスの別の配列に割り当てるか、@property配列を更新する必要があります。データベースを更新する前に、@property配列をエンティティ属性に戻す必要があります。

// to hold the player items
// _player.items cannot be directly updated
@property (strong, nonatomic) NSMutableArray* items;

- (void)viewDidLoad
{
    [super viewDidLoad];
    ...
    NSError* err = nil;
    NSMutableArray* results = [[_moc executeFetchRequest:fr error:&err] mutableCopy];
    if (err || results.count == 0)
    {
        ...
    } else
    {
        _player = [results objectAtIndex:0];
        _items = _player.items;
    }
}

// events
- (void)itemWasDropped:(ItemIndex)item
{
    // the current number of this item
    int nNum = [[_items objectAtIndex:item] intValue];
    // to increment the number
    [_items replaceObjectAtIndex:item withObject:[NSNumber numberWithInt:nNum + 1]];
}

- (void)viewWillDisappear:(BOOL)animated
{
    // to update the database
    _player.items = _items;
    NSError* err = nil;
    BOOL bSucc = [_moc save:&err];
    if (err || !bSucc)
    {
         ...
    }
}
于 2013-10-19T21:54:12.500 に答える