- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在 UICollectionView 的 batchUpdate 操作中确定了一个简单的边缘情况,它应该可以工作但失败了
attempt to perform an insert and a move to the same index path ( {length = 2, path = 0 - 2})
我的操作是从[A, B] --> [C, B', A]。这是通过更新完成的:
很明显错误不对,insert索引和move TO索引不一样。
我设置了演示以确保这是一个 UICollectionView 问题,如果您想查看它的实际效果,这是我的代码:
@implementation ViewController {
UICollectionView *_collection;
NSArray *_values;
}
- (instancetype)init
{
self = [super init];
if (self) {
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
_collection = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
_collection.dataSource = self;
_values = @[@1, @2];
[_collection registerClass:[UICollectionViewCell class]
forCellWithReuseIdentifier:@"reuse"];
[self.view addSubview:_collection];
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
_collection.frame = self.view.bounds;
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self triggerBatchUpdate];
});
}
- (void)triggerBatchUpdate {
[_collection performBatchUpdates:^{
_values = @[@4, @5, @1];
[_collection insertItemsAtIndexPaths:@[[self index:0]]];
[_collection moveItemAtIndexPath:[self index:0] toIndexPath:[self index:2]];
// Works with this line
// [_collection moveItemAtIndexPath:[self index:1] toIndexPath:[self index:1]];
// Fails with this line
[_collection reloadItemsAtIndexPaths:@[[self index:1]]];
} completion:nil];
}
- (NSIndexPath *)index:(NSUInteger)ind {
return [NSIndexPath indexPathForRow:ind inSection:0];
}
- (NSInteger)collectionView:(UICollectionView *)collectionView
numberOfItemsInSection:(NSInteger)section {
return _values.count;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *cell = [_collection dequeueReusableCellWithReuseIdentifier:@"reuse"
forIndexPath:indexPath];
cell.backgroundColor = [UIColor grayColor];
return cell;
}
@end
事实上如果我使用代码就可以工作
[_collection moveItemAtIndexPath:[self index:1] toIndexPath:[self index:1]];
代替
[_collection reloadItemsAtIndexPaths:@[[self index:1]]];
让我怀疑。这两个操作应该是等价的。
知道这里发生了什么吗?我认为这是 UICollectionView 错误吗?
编辑:另一个与此有关的崩溃:
attempt to perform a delete and a move from the same index path ( {length = 2, path = 0 - 5})
最佳答案
这似乎是一个错误,虽然 performBatchUpdates:completion
的文档解释了插入和删除操作中索引的上下文,并提到允许重新加载操作,但它没有详细说明重新加载操作中索引的上下文。
经过一些实验,似乎“在幕后”重新加载是作为删除和插入实现的。这似乎会导致一些其他操作与重新加载索引之间存在重叠的问题。
不过,我确实发现用显式删除和插入替换重新加载似乎可行,因此您可以使用:
- (void)triggerBatchUpdate {
[_collection performBatchUpdates:^{
_values = @[[UIColor blueColor], [UIColor yellowColor], [UIColor redColor]];
[_collection moveItemAtIndexPath:[self index:0] toIndexPath:[self index:2]];
[_collection insertItemsAtIndexPaths:@[[self index:0]]];
[_collection deleteItemsAtIndexPaths:@[[self index:1]]];
[_collection insertItemsAtIndexPaths:@[[self index:1]]];
} completion:nil];
}
关于ios - UICollectionView BatchUpdate 边缘案例失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42147822/
这个问题已经有答案了: Java MongoDB save multiple documents at once (5 个回答) 已关闭 3 年前。 jdbcTemplate.batchUpdate(
谁能帮我解答一下这个问题:如果我执行 JDBC batchUpdate,它更新多个表并且不包含在任何事务中,它会锁定任何表或行吗? 我的代码执行一堆 UPDATE 语句,所有语句如下所示 St
我正在使用 batchUpdate() 在表中插入多条记录。根据要求,如果主键在插入时存在重复值,则应使用最新接收到的数据对其进行更新,因此我尝试在 INSERT< 中使用 ON DUPLICATE
我在 UICollectionView 的 batchUpdate 操作中确定了一个简单的边缘情况,它应该可以工作但失败了 attempt to perform an insert and a mov
类似的电话 spreadsheets.batchUpdate和 spreadsheets.values.batchUpdate可以在一次调用中执行多个更新操作。 我在 https://develope
我正在使用 NamedParameterJdbcTemplate.batchUpdate 对我的数据库表进行批量更新,但我想禁用 auto-commit 并手动执行提交。 我可以从 connectio
在处理大量查询时,我遇到了 JdbcTemplate.batchUpdate(String[] requests) 方法的问题。 该语句正在执行,没有任何异常,但更新未反射(reflect)在数据库中
我正在尝试使用 batchUpdate 更新表中的数千行。我的要求是: 1) 假设一个批次有 1000 条记录。记录号 235 导致了错误。如何找出导致错误的记录。 2) 假设记录 600 没有导致更
这个问题已经有答案了: JDBC Batch Update Problem (7 个回答) 已关闭 9 年前。 我正在使用 spring 的 NamedParameterJdbcTemplate ba
我正在使用 spring 将批处理记录插入到数据库中。但我收到此错误:java.sql.SQLException:无法在 java.util.ArrayList 和 JAVA_OBJECT 之间转换。
我正在尝试使用 org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate 批量更新表。 nameParameterJdbc
我有一个使用 Spring 的名为 JDBC 的 mysql batchUpdate,如下所示: public SqlParameterSource[] getBatchParamsArray(Col
需要插入记录使用spring jdbctemplate批量更新。插入时如果发现重复记录,则需要更新记录否则插入。我怎么做?下面是我的代码。 注意:没有包含异常处理。 result = jdbcTem
我有一个 collectionView,它有 3 个部分,每个部分都有一个不同的单元格(将单元格的数据分成单独的部分比只分成 1 个部分更容易)。 collectionView 的数据源中只有一个 d
我正在做的项目使用了以下依赖 org.springframework spring-jdbc 3.2.0.RELEASE 有了这个,我将进行以下方法调用 (1) temp
我想从 org.springframework.jdbc.core.JdbcTemplate.batchUpdate 获取插入/更新的行 ID(主键) 有什么方法可以像 this 一样使用 KeyHo
我一直在寻找一种最佳方式更新大量行的方法,因为 orm 操作速度很慢,最终我当前使用的解决方案是通过 jdbc 批量更新将数据库更新包装在 forkjoinpool 任务中。(使用 ORM 在数据库中
我正在尝试使用批量更新来更新表中的数据。当我更新数据时,出现了一些失败。我想获取失败查询的更新语句。例如,如果失败的查询是“update table set abc= 123”。然后我希望异常处理程序
假设,我们要通过java代码在mysql表中插入20行。以下哪种方法有效以及原因。 1)使用executeBatch将所有插入语句合并为一批,然后使用Preparedstatement的commit方
我有 MariaDb 实例和一个临时表。工作流程: 开始交易 如果存在则删除临时表,创建临时表 使用 insert into TEMP1 (xxx,yyy) values(?,?),(?,?),(?,
我是一名优秀的程序员,十分优秀!