NSFetchResultController用于在Apple Watch上显示记录?

时间:2015-04-08 07:38:22

标签: ios objective-c nsfetchedresultscontroller apple-watch

我可以在Apple Watch上使用NSFetchResultController在表格中显示80到90条记录吗?

我正在使用WKInterfaceTable+IGInterfaceDataTable来使用数据源类型加载方法,因为这似乎比使用NSArray更简单。

NSFetchResultController会有助于提高效率,还是会让它变慢?

3 个答案:

答案 0 :(得分:1)

我发现NSFetchResultController在iWatch应用程序中根本没用,因为WKInterfaceTable不支持委托方法来编辑,更改或删除NSFetchResultController在委托中支持的单行。所以你必须每次更新你想要显示的所有数据,所以我认为我们不应该使用它。

答案 1 :(得分:1)

我将NSFetchedResultControllerWKInterfaceTable用于Apple Watch应用程序。确实,它不如UITableViewController那么方便,但它是非常可行的。我没有任何性能问题,即使在加载20多行(没试过80-90)。当然这是在模拟器中,所以我不知道设备本身会如何表现。

插入,更新和删除你必须自己实现,但不是那么难。

我在InterfaceController中的部分代码下面以插入行为例,但编辑和删除并不困难:


<强>接口

...
@property (weak, nonatomic) IBOutlet WKInterfaceTable *interfaceTable;
@property(strong, nonatomic) NSFetchRequest *fetchRequest;
@property(strong, nonatomic) NSFetchedResultsController *fetchedResultsController;
@property(strong, nonatomic) NSMutableArray *data;
...

<强>实施

提取与以往一样,除了我们没有将委托分配给resultscontroller,而是直接保存数据:

self.fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"YourModel" inManagedObjectContext:self.managedObjectContext];
self.fetchRequest.entity = entityDescription;

[self.fetchRequest setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"createdAt" ascending:YES]]];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:self.fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];

[self.fetchedResultsController performFetch:&error];
self.data= self.fetchedResultsController.fetchedObjects;

然后我使用函数loadTableData

- (void)loadTableData {
    [self.interfaceTable setNumberOfRows:[[self data] count] withRowType:@"YourCustomCell"];
    [self.interfaceTable insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:[[self data] count]] withRowType:@"YourRowType"];

    for (int i = 0; i<[[self data] count];i++)
        [self configureRowControllerAtIndex:i];

}

哪个调用configureRowControllerAtIndex,一个填充一行的函数(我有两个标签):

- (void)configureRowControllerAtIndex:(NSInteger)index {
    WKTableVIewRowController *listItemRowController = [self.interfaceTable rowControllerAtIndex:index];

    [listItemRowController setTitle:[[self.data[index] title] integerValue]];

    [listItemRowController setDescription:[self.data[index] description]];

}

当您插入新行时,只需在数据数组中的managedObjectContext 中手动添加它:

// Add in managedObjectContext
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"YourModel" inManagedObjectContext:self.managedObjectContext];

YourModel *newRow = [[YourModel  alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:nil];
// Add in data array
[self.data addObject:newRow];

并定期保存managedObjectContext:

if (![self.managedObjectContext save:&error]) {
    if (error) {
        NSLog(@"Unable to save changes.");
        NSLog(@"%@, %@", error, error.localizedDescription);
    }
}

答案 2 :(得分:0)

NSFetchedResultsControllerWKInterfaceTable合作是PITA。地狱,将普通数组/数据字典映射到WKInterfaceTable很糟糕。我们构建并开源了一个简单的库,以使这更容易,至少使API类似于UITableView。只是有一些外部帮助添加了对NSFetchedResultsController的支持。希望这可以在将来有所帮助!

https://github.com/Instagram/IGInterfaceDataTable