我可以在Apple Watch上使用NSFetchResultController
在表格中显示80到90条记录吗?
我正在使用WKInterfaceTable+IGInterfaceDataTable
来使用数据源类型加载方法,因为这似乎比使用NSArray
更简单。
NSFetchResultController
会有助于提高效率,还是会让它变慢?
答案 0 :(得分:1)
我发现NSFetchResultController在iWatch应用程序中根本没用,因为WKInterfaceTable不支持委托方法来编辑,更改或删除NSFetchResultController在委托中支持的单行。所以你必须每次更新你想要显示的所有数据,所以我认为我们不应该使用它。
答案 1 :(得分:1)
我将NSFetchedResultController
和WKInterfaceTable
用于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)
让NSFetchedResultsController
与WKInterfaceTable
合作是PITA。地狱,将普通数组/数据字典映射到WKInterfaceTable
很糟糕。我们构建并开源了一个简单的库,以使这更容易,至少使API类似于UITableView
。只是有一些外部帮助添加了对NSFetchedResultsController
的支持。希望这可以在将来有所帮助!