0

特定の列のセルを非同期的に更新する必要があるアプリがあります。ブロックが追加されたGCDキューがあり、後で使用して指定された行と列のセルを取得します-rowForItem:が、結果-rowForItem:は一貫して0であり、NSAssert([self.outlineView itemAtRow:row] == item, @"rowForItem: and itemForRow: not reversible! (Item %@, row %ld)", item, (long)row);毎回スローされます。ここで何が間違っているのかわかりません。インデックスは -1 ではありません。これは、アイテムが見つからなかったことを意味しますが、アイテムは正しくないインデックスにあると言われています。(最初の項目は常に JODirectoryInfo であり、JOFileInfo でのみブロックを実行するため、間違った項目になることはありません。)

- (NSTableCellView *)_cellForRow:(NSInteger)row columnIdentifier:(NSString *)column {
    if (row < 0) return nil;
    NSInteger colIdx = [self.outlineView columnWithIdentifier:column];
    if (colIdx == -1) return nil;
    if (colIdx + 1 > self.outlineView.tableColumns.count) return nil;
    return [self.outlineView viewAtColumn:colIdx row:row makeIfNecessary:NO];
}
- (NSTableCellView *)_cellForItem:(id)item columnIdentifier:(NSString *)column {
    NSInteger row = [self.outlineView rowForItem:item];
    NSAssert([self.outlineView itemAtRow:row] == item, @"rowForItem: and itemForRow: not reversible! (Item %@, row %ld)", item, (long)row);
    DDLogVerbose(@"Getting cell for item %@ (row %ld) in column %@", item, (long)row, column);
    return [self _cellForRow:row columnIdentifier:column];
}

- (dispatch_block_t)_loadingBlockForItem:(JOFileInfo *)item block:(JOFileInfoBlock)block column:(NSString *)columnIdentifier {
    return ^{
        NSTableCellView *cellView = [self _cellForItem:item columnIdentifier:columnIdentifier];
        if (!cellView) return;
        cellView.objectValue = block(item);
    };
}
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
    DDLogVerbose(@"Requested value of column %@ for item %@", tableColumn.identifier, item);
    if ([tableColumn.identifier isEqualToString:@"Size"]) {
        if ([item isKindOfClass:[JOFileInfo class]]) {
            dispatch_async(self.queue, [self _loadingBlockForItem:item block:^(JOFileInfo *item) {
                unsigned long long size = item.size;
                if (size != ULONG_LONG_MAX) return [self.byteCountFormatter stringFromByteCount:size];
                else return @"--";
            } column:tableColumn.identifier]);
            return @"--";
        } else {
            return @"--";
        }
    } else {
        return @"text";
    }
}
4

1 に答える 1