0

グランドセントラルディスパッチを使用して NSArray をフィルタリングしようとしています。配列をフィルタリングすることができ、呼び出す[tableView reloadData]と正しい値が NSLog によって出力されます。ただし、ビューには以前の値が表示されます。

たとえば、アイテムのコレクションが でありRed, Orange, Yellow、 をフィルター処理するrと、NSLogs は 2 つの行があり、セルはRedOrangeであると出力しますが、3 つのセルはすべて表示されます。検索が になるとra、NSLog は と呼ばれる行が 1 つしかないことを示しますOrangeが、セルRedOrangeが表示されます。

- (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;
}
4

1 に答える 1

2

これを試して:

- (void)filterItems:(NSString *)pattern
{
       NSMutableArray *array = [NSMutableArray arrayWithArray:items];
       dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
           //lots of code to filter the items using "array", NOT items
           dispatch_async(dispatch_get_main_queue(), ^{
               items = array; // or [NSArray arrayWithArray:array] if you really don't want a mutable array
               [tableView reloadData];
           });
       });
}

コメント: self を使用する必要はありません。はい、ブロックの実行中は自己が保持されますが、ブロックが終了すると再び解放されます。これが実行されている間にこのオブジェクトが本当に消えることができる場合は、OK、自己への弱い参照を使用してください。

「items」をローカルおよびブロック内の名前として使用しましたが、念のためローカル変数名を配列に変更しました。

于 2012-07-20T23:31:49.573 に答える