Это правильный способ перезагрузить данные на UITableView? - PullRequest
0 голосов
/ 05 июня 2010

Я пытаюсь добавить объекты в мой источник данных и затем перезагрузить таблицу. Это правильный подход к нему?

self.items - мой источник данных

//Copy current items
        self.itemsCopy = [self.items mutableCopy];//[[NSMutableArray alloc] initWithArray:self.items copyItems:NO];

        NSLog(@"Copy Size before append: %d",[itemsCopy count]);

        //Get new items
        int lastMsgID = [self getLastMessageID];
        [self.coreData getMoreMessages:self.title lastID:lastMsgID]; //This will update self.items with 30 objects

        //Append new items
        [itemsCopy addObjectsFromArray:self.items];

        //Empty items and copy itemsCopy
        [self.items removeAllObjects];
        self.items = [self.itemsCopy mutableCopy];

        NSLog(@"Actual Size after append: %d",[self.items count]);

        //Reload data
        [tableView reloadData];

Ответы [ 3 ]

1 голос
/ 06 июня 2010

попробуй

[tableView reloadData];

в методе viewWillAppear ....

0 голосов
/ 27 марта 2011

Если вы используете CoreData, то в идеале вы должны использовать NSFetchedResultsController для управления данными для табличного представления. (Вы просили «правильный» путь :-)

В итоге вы получите приложение с более эффективным использованием памяти.

См. Образец iPhoneCoreDataRecipes для хорошего примера

0 голосов
/ 05 июня 2010

Да, выглядит правильно для меня.

В зависимости от того, как объявлены ваши свойства, у вас могут возникнуть некоторые проблемы с памятью. Если в ваших свойствах задано сохранение в качестве атрибута, то при назначении им копии массива будет сохранено значение 2 для объекта, а не для предполагаемого 1.

Например.

self.myProperty = [myArray mutableCopy];

mutableCopy возвращает вновь выделенный объект с сохраненным счетчиком, равным единице. Вызывающий объект владеет этим объектом и несет ответственность за его освобождение. Затем вы присваиваете это свойству, которое сохраняет его, увеличивая количество сохраняемых объектов до 2. Объект будет утек, когда владелец будет освобожден, поскольку свойство будет освобождено только один раз.

Решение состоит в том, чтобы выпустить изменяемую копию после присвоения и сохранения ее для свойства, подобного этому.

self.myProperty = [myArray mutableCopy];
[self.myProperty release];

В качестве альтернативы вы можете автоматически разблокировать результат mutableCopy. Однако, кажется, есть некоторые противоречия, связанные с использованием автоматического выпуска на iPhone. Лично я не вижу проблемы с этим, если он не используется в узком цикле, который повторяется много раз за короткий промежуток времени.

self.myProperty =[[myArray mutableCopy] autorelease];
...