您的位置:首页 > 移动开发 > IOS开发

iOS开发-beginUpdates && endUpdates用法

2016-03-29 10:36 323 查看
本篇主要介绍使用beginUpdates和endUpdates方法对UITableView的Cell进行批量操作更新。首先给出过程中依赖的数据源:
<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.arraySections</span> = [<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableArray</span> arrayWithCapacity:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>];
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableArray</span> *array1 = [<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableArray</span> arrayWithObjects:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Apple"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Alice"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Apache"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"amount"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"application"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"abort"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"action"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"alert"</span>, <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">nil</span>];
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableArray</span> *array2 = [<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableArray</span> arrayWithObjects:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"BMW"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Beach"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Boom"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Band"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"BBBB"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"baby"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"bear"</span>, <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">nil</span>];
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableArray</span> *array3 = [<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableArray</span> arrayWithObjects:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Cache"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Clean"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"clear"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Class"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Client"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"count"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ccc"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"can"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ccccca"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"c1618"</span>, <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">nil</span>];
[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.arraySections</span> addObject:array1];
[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.arraySections</span> addObject:array2];
[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.arraySections</span> addObject:array3];</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>


beginUpdates
endUpdates
方法是一对绑定在一起的方法,用来对
UITableView
批量更新操作。先看一下多个插入删除操作不使用
beginUpdates
endUpdates
的情况:
<code class="hljs lua has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">    NSMutableArray *array1 = (NSMutableArray *)self.arraySections[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>];
//操作<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> 删除
[array1 removeObjectAtIndex:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>];
[self.tableMain deleteRowsAtIndexPaths:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">[[NSIndexPath indexPathForRow:0 inSection:0]]</span> withRowAnimation:UITableViewRowAnimationAutomatic];
//操作<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> 插入
[array1 insertObject:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"insert"</span> atIndex:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>];
[self.tableMain insertRowsAtIndexPaths:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">[[NSIndexPath indexPathForRow:3 inSection:0]]</span> withRowAnimation:UITableViewRowAnimationAutomatic];
//操作...</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>


这种做法对于每一个操作,是严格按照顺序执行的,先执行操作1,再执行操作2…再执行任意一个操作的时候,先更新数据源,然后调用表视图的相关操作,该操作方法执行完毕后,会立即调用相关的代理方法更新表视图。更新完毕后继续执行下一个操作…即整个过程是不断地调用代理方法来更新表视图。因此对于这种按序更新的方法,每一个更新操作并不是同时进行的,如果有很多个操作,可能通过肉眼就能看出更新的先后,这通常并不是我们想要的。

通过
beginUpdates
endUpdates
则可以批量处理操作,区别于上面的操作一个一个执行然后不断更新表视图,批量处理实现了在所有操作执行完后调用代理方法一次性更新表视图,这种方法保证了所有操作最终是同时更新的。

beginUpdates
endUpdates
批量更新有三部曲:

更新数据源(所有操作)
创建相应的indexPaths数组
执行操作

下面举例说明:
<code class="hljs lua has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">    //更新数据源
NSMutableArray *array1 = (NSMutableArray *)self.arraySections[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>];
[array1 removeObjectAtIndex:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>];
[array1 removeObjectAtIndex:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>];
[array1 insertObject:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"111"</span> atIndex:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>];
[array1 insertObject:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"333"</span> atIndex:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>];

//创建相应的indexPaths数组
NSArray *indexPathsDelete = @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">[[NSIndexPath indexPathForRow:0 inSection:0],[NSIndexPath indexPathForRow:2 inSection:0]]</span>;
NSArray *indexPathsInsert = @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">[[NSIndexPath indexPathForRow:1 inSection:0],[NSIndexPath indexPathForRow:3 inSection:0]]</span>;

//执行操作
[self.tableMain beginUpdates];
[self.tableMain deleteRowsAtIndexPaths:indexPathsDelete withRowAnimation:UITableViewRowAnimationFade];

[self.tableMain insertRowsAtIndexPaths:indexPathsInsert withRowAnimation:UITableViewRowAnimationFade];
[self.tableMain endUpdates];</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>


beginUpdates和endUpdates方法对之间的操作执行后并没有立刻更新表视图,而是等endUpdates方法返回后才调用代理方法一次性更新的,因此所有更新动画都是同时执行的。

执行前后的表视图显示如下:

执行前:



执行后:



执行完这段代码,产生如下几个问题:

问题一:代理方法是根据数据源来更新视图的,既然数据源已经更新了,
endUpdates
返回后代理方法也会执行,那么
beginUpdates
endUpdates
之间的操作有什么用呢?

猜想这个过程并不是这么简单的,假如真的只是根据数据源的更新来刷新视图的话,我更新数据源一个reloadData不就搞定了,还要那么麻烦干嘛!怎么验证这个猜想?很简单,把数据源更新后的结果打印出来看看,如果和表视图显示的不一致,那么猜想就是合理的。打印结果如下:



事实上对比发现,两者确实是不一致的;另外还有一种验证方法,把beginUpdates和endUpdates之间的更新操作全都注释掉,再次运行就发现表视图根本就不更新了,断点发现cellForRowAtIndexPath:根本就没被调用。种种迹象表明,insert/delete这些更新方法定有什么不可告人的秘密!具体这个秘密是什么?是怎么和数据源配合的?我也不得而知!

问题二:
beginUpdates
endUpdates
之间的
insert
操作和
delete
操作交换顺序会影响结果吗?

答案是不会!交换了两个操作方法,执行结果无差。官方文档中找到了这样的说明:

The code calls the deleteRowsAtIndexPaths:withRowAnimation: method after it calls insertRowsAtIndexPaths:withRowAnimation:. However, this is not the order in which UITableView completes the operations. It defers any insertions of rows or sections until after
it has handled the deletions of rows or sections.

大致意思就是:
deletion
操作比
insertion
操作有更高执行优先权。

因此在执行
insertion
操作的时候,
deletion
操作已经执行完毕。这样就要小心了,因为
deletion
是在原始表视图的
indexPaths
上操作的,而
insertion
则是在
deletion
操作之后的表视图的
indexPaths
上操作的,两者参照不同!官方文档中也给了这样的提示:

Deletion and reloading operations within an animation block specify which rows and sections in the original table should be removed or reloaded; insertions specify which rows and sections should be added to the resulting table.

端倪在于这个
original table
resulting
table


问题三:数据源更新顺序对结果有影响吗?

答案是有!将上面代码中将数据源插入代码放到删除前面,运行结果变了,而且变成一种我看了变天也没看出规律的结果。



因此再一次证明了问题一种的结论,更新操作函数和数据源真的很有一腿!好了说正经的,如果谁知道操作函数和数据源之间的关联,麻烦告知小弟,非常感谢!!虽然数据源”插入”在”删除”前的结果没有预料到,但是”删除”在”插入”之前的结果还是在意料之中的,因此以后默认就把”删除”写在”插入”前面吧,实属无奈!

下面再看一个例子,用来证明问题二中的相关结论。
<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//更新数据源</span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableArray</span> *array1 = (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableArray</span> *)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.arraySections</span>[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>];
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableArray</span> *array3 = (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableArray</span> *)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.arraySections</span>[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>];
[array1 removeObjectAtIndex:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>];             <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//删除第0分组第0记录</span>
[array1 removeObjectAtIndex:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>];             <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//删除第0分组第2记录</span>
[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.arraySections</span> removeObjectAtIndex:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//删除第1分组</span>
[array1 insertObject:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"1111"</span> atIndex:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>];    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//插入第0分组第1记录</span>
[array3 insertObject:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"3333"</span> atIndex:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>];    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//插入第2分组第0记录</span>

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建相应的indexPaths数组</span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSArray</span> *indexpathsDelete = @[[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSIndexPath</span> indexPathForRow:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> inSection:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>],[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSIndexPath</span> indexPathForRow:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> inSection:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]];
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSArray</span> *indexpathsInsert = @[[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSIndexPath</span> indexPathForRow:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> inSection:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>],[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSIndexPath</span> indexPathForRow:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> inSection:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*要插入的是第2分组第0记录,但这里的分组数却为1,思考原因*/</span>];

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//执行操作</span>
[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.tableMain</span> beginUpdates];
[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.tableMain</span> insertRowsAtIndexPaths:indexpathsInsert withRowAnimation:UITableViewRowAnimationFade];
[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.tableMain</span> deleteSections:[NSIndexSet indexSetWithIndex:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>] withRowAnimation:UITableViewRowAnimationFade];
[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.tableMain</span> deleteRowsAtIndexPaths:indexpathsDelete withRowAnimation:UITableViewRowAnimationFade];
[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.tableMain</span> endUpdates];</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul>


执行后界面如下:



由于在执行insert之前,
delete
已经执行完毕了,原始的第1分组已经被删除了,原始第2分组变为第1分组,因此
insert
方法所要插入的第二个cell的
indexPath
对应的
section
为1而不是2。

总结一下:如果只是单纯的一个插入或者删除操作,没必要用
beginUpdates
endUpdates
包裹操作方法;若是批量操作,建议用
endUpdates
endUpdates
,已保证界面对各个更新操作同时响应。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: