2015-04-08 15 views
9

Tôi có thể sử dụng NSFetchResultController trên đồng hồ Apple để hiển thị 80 đến 90 bản ghi trong bảng không?NSFetchResultController để hiển thị bản ghi trên Đồng hồ Apple?

Tôi đang sử dụng WKInterfaceTable+IGInterfaceDataTable để sử dụng phương thức tải loại nguồn dữ liệu vì dường như tôi đơn giản hơn việc sử dụng NSArray.

Liệu NSFetchResultController có giúp tăng hiệu quả hoặc làm chậm hiệu quả không?

Trả lời

1

Tôi thấy rằng NSFetchResultController không hữu ích chút nào trong ứng dụng iWatch vì WKInterfaceTable không hỗ trợ phương thức đại biểu để chỉnh sửa, thay đổi hoặc xóa cho một hàng mà NSFetchResultController hỗ trợ trong ủy nhiệm. vì vậy bạn sẽ phải cập nhật tất cả dữ liệu mà bạn muốn hiển thị mỗi lần vì vậy tôi nghĩ chúng ta không nên sử dụng nó.

1

Tôi đã sử dụng NSFetchedResultControllerWKInterfaceTable cho ứng dụng Apple Watch của mình. Đúng là nó không thuận tiện như một UITableViewController, nhưng nó rất dễ làm. Tôi không có bất kỳ vấn đề về hiệu suất nào, ngay cả khi đang tải hơn 20 hàng (không thử 80-90). Tất nhiên điều này là trong giả lập, vì vậy tôi không biết làm thế nào các thiết bị chính họ sẽ hành xử.

Chèn, cập nhật và xóa bạn phải tự triển khai, nhưng không quá khó.

Dưới đây là một phần của mã của tôi trong InterfaceController, với chèn hàng làm ví dụ, nhưng chỉnh sửa và xóa không phải là khó khăn hơn:


Interface

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

Thực hiện

Việc tìm nạp giống như mọi khi, ngoại trừ việc chúng tôi không gán một đại biểu đến resultscontroller, nhưng lưu dữ liệu trực tiếp:

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; 

sau đó tôi sử dụng một chức năng 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]; 

} 

nào gọi configureRowControllerAtIndex, một chức năng mà populates một hàng (Tôi có hai nhãn) :

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

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

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

} 

Khi bạn chèn một hàng mới, chỉ cần thêm nó bằng tay trong managedObjectContext trong mảng dữ liệu:

// 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]; 

và thường xuyên lưu managedObjectContext:

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

cách bạn xử lý gọi lại phương pháp NSFetchResultControllerDelegates? Tôi nghĩ rằng bạn cần phải tính toán tất cả các hàng và những thứ khác ngay cả khi bạn thêm một mục vì iWatch hiển thị màn hình một lần cho bảng và để thực hiện một thay đổi duy nhất, bạn cần tải lại tất cả dữ liệu bảng. –

+0

Bây giờ tôi tải lại bảng sau khi chèn, cập nhật, xóa, có. Bạn có thể cập nhật một hàng hiện có với 'configureRowControllerAtIndex' mặc dù (xem ở trên). Bạn muốn sử dụng phương thức gọi lại nào? 'didChangeObject: atIndexPath' và như vậy bạn có thể thay thế bằng cách thực hiện các khối của bạn (trên một luồng riêng biệt) sau khi' configureRowControllerAtIndex' chạy. Điều đó hoạt động tốt trong ứng dụng Đồng hồ. – Wouter

0

Bắt NSFetchedResultsController làm việc với WKInterfaceTable là một Pita. Địa ngục, lập bản đồ mảng đồng bằng/từ điển dữ liệu để WKInterfaceTable hút. Chúng tôi xây dựng và mở có nguồn gốc một thư viện đơn giản để làm cho điều này dễ dàng hơn, ít nhất là làm cho API tương tự như UITableView. Chỉ cần có một số trợ giúp bên ngoài thêm hỗ trợ cho NSFetchedResultsController. Hy vọng rằng điều này có thể giúp đỡ trong tương lai!

https://github.com/Instagram/IGInterfaceDataTable

Các vấn đề liên quan