グランドセントラルディスパッチを使用して NSArray をフィルタリングしようとしています。配列をフィルタリングすることができ、呼び出す[tableView reloadData]
と正しい値が NSLog によって出力されます。ただし、ビューには以前の値が表示されます。
たとえば、アイテムのコレクションが でありRed, Orange, Yellow
、 をフィルター処理するr
と、NSLogs は 2 つの行があり、セルはRed
とOrange
であると出力しますが、3 つのセルはすべて表示されます。検索が になるとra
、NSLog は と呼ばれる行が 1 つしかないことを示しますOrange
が、セルRed
とOrange
が表示されます。
- (void)filterItems:(NSString *)pattern{
__weak MYSearchViewController *weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSMutableArray *items = [weakSelf.items copy];
//lots of code to filter the items
dispatch_async(dispatch_get_main_queue(), ^{
weakSelf.items = [items copy];
[weakSelf.tableView reloadData];
});
});
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSLog(@"Rows: %d",[self.items count]);
return [self.items count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"MYCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
}
NSInteger row = [indexPath row];
MYItem *item = [self.items objectAtIndex:row];
//code to setup cell
NSLog(@"Row %d, Item %@, Cell %d", row, item.info, cell.tag);
return cell;
}