- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 UITableView 的数据源。有时我在 cellForRowAt 方法中得到一个 indexOutOfBound 异常,因为它可能发生在 tableView 的 numberOfRowsInSection 方法被调用然后上下文切换并且由于某种原因数据源中的项目需要更新(删除特定项目并添加这些项目的更新版本)但是当它只是删除项目并且在添加新项目之前上下文被切换回并尝试加载单元格但随后一些项目被删除所以它抛出异常。
我想在一个 block 中进行绑定(bind)删除和添加,这样它只会在执行完整 block 后更改上下文,即
[self removeObjects:@[ lastUserChatMessage ]];
lastUserChatMessage.state = KUSChatMessageStateFailed;
[ self upsertObjects:@[ lastUserChatMessage ]];
我希望上下文在第一个语句之后永远不会切换。它必须执行到最后一条语句。
@syncronized block 可以达到这个目的吗?但请记住,所有操作都在主线程中完成。
最佳答案
我认为这对你的情况没有多大意义。 TableView 可以选择在任何给定时间调用任何数据源方法。您需要保管好您的数据以使其保持一致。通常,当您更改数据源时,您应该调用 reloadData
或在 TableView 上执行开始/结束更新过程。由于 TableView 在主线程上工作,因此在处理数据时应该执行相同的操作。
因此,如果您正在处理多个线程或无论如何无法控制地修改数据源,那么您应该在完成后始终创建一个副本。然后使用该副本作为数据源并重新加载 TableView 。在最坏的情况下,你应该这样做:
- (void)setNewData:(NSArray *)newData {
NSArray *duplicate = [newData copy];
dispatch_async(dispatch_get_main_queue(), ^(void){
self.dataArray = duplicate;
[self.tableView reloadData];
});
}
在这种情况下,self.dataArray
应该在 TableView 数据源方法中使用,它永远不会让您失望。
关于ios - Objective-C 中的 @syncronized block 是否保证在上下文切换到执行其他代码之前完全执行该 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56539502/
请给我一些建议。在我的应用程序中有登录表,我需要将登录数据(从网络服务器)同步到我的应用程序。每天都有新人添加一个帐户。 所以现在表格看起来像这样: 登录表 id name age
我想确保我正确理解了这些概念。解释/确认将对我有很大帮助,我相信还有很多其他程序员。以下是我对这些概念的理解,这是我调查的结果: 当您想在多个线程之间共享一个变量时,使用 Volatile。a) 声明
我正在使用 EclEmma 进行覆盖率分析。 我的 Java 代码包含一个 synchronized(MyClass.class) {} block 。 EclEmma 说它只被部分覆盖,尽管我有一个
我有一个 UITableView 的数据源。有时我在 cellForRowAt 方法中得到一个 indexOutOfBound 异常,因为它可能发生在 tableView 的 numberOfRows
我正在尝试将一些 Objective-C 代码转换为 Swift。我发现了一些类似的问题:Swift equivalent to Objective-C Synchronized和 objc_sync
故事 我正在为科学相机编写驱动程序。它使用 Cypress FX3 USB 外设 Controller 。为了与之通信,我使用 libusb1 for python,特别是模块 usb1。我的操作系统
我是一名优秀的程序员,十分优秀!