Skip to content

Commit f4e0b7d

Browse files
committed
fix: ios is multithread. Ensure operations are run on the main thread
will also ensure things are done in the right order
1 parent 86b12f8 commit f4e0b7d

File tree

1 file changed

+43
-33
lines changed

1 file changed

+43
-33
lines changed

src/collectionview.ios.ts

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export * from './collectionview-common';
2626
const infinity = layout.makeMeasureSpec(0, layout.UNSPECIFIED);
2727

2828

29+
const main_queue = dispatch_get_current_queue();
2930

3031
export enum ContentInsetAdjustmentBehavior {
3132
Always = UIScrollViewContentInsetAdjustmentBehavior.Always,
@@ -248,9 +249,11 @@ export class CollectionView extends CollectionViewBase {
248249
if (Trace.isEnabled()) {
249250
CLog(CLogTypes.info, 'deleteItemsAtIndexPaths', indexes.count);
250251
}
251-
view.performBatchUpdatesCompletion(() => {
252-
view.deleteItemsAtIndexPaths(indexes);
253-
}, null);
252+
dispatch_async(main_queue, () => {
253+
view.performBatchUpdatesCompletion(() => {
254+
view.deleteItemsAtIndexPaths(indexes);
255+
}, null);
256+
});
254257
return;
255258
}
256259
case ChangeType.Update: {
@@ -259,10 +262,12 @@ export class CollectionView extends CollectionViewBase {
259262
if (Trace.isEnabled()) {
260263
CLog(CLogTypes.info, 'reloadItemsAtIndexPaths',event.index, indexes.count);
261264
}
262-
UIView.performWithoutAnimation(()=>{
263-
view.performBatchUpdatesCompletion(() => {
264-
view.reloadItemsAtIndexPaths(indexes);
265-
}, null);
265+
dispatch_async(main_queue, () => {
266+
UIView.performWithoutAnimation(()=>{
267+
view.performBatchUpdatesCompletion(() => {
268+
view.reloadItemsAtIndexPaths(indexes);
269+
}, null);
270+
});
266271
});
267272

268273
return;
@@ -275,36 +280,39 @@ export class CollectionView extends CollectionViewBase {
275280
if (Trace.isEnabled()) {
276281
CLog(CLogTypes.info, 'insertItemsAtIndexPaths', indexes.count);
277282
}
278-
view.performBatchUpdatesCompletion(() => {
279-
view.insertItemsAtIndexPaths(indexes);
280-
}, null);
283+
dispatch_async(main_queue, () => {
284+
view.performBatchUpdatesCompletion(() => {
285+
view.insertItemsAtIndexPaths(indexes);
286+
}, null);
287+
});
281288
// Reload the items to avoid duplicate Load on Demand indicators:
282289
return;
283290
}
284291
case ChangeType.Splice: {
285-
view.performBatchUpdatesCompletion(() => {
286-
if (event.addedCount > 0) {
287-
const indexes = NSMutableArray.alloc<NSIndexPath>().init();
288-
for (let index = 0; index < event.addedCount; index++) {
289-
indexes.addObject(NSIndexPath.indexPathForItemInSection(event.index + index, 0));
290-
}
291-
view.insertItemsAtIndexPaths(indexes);
292-
}
293-
if (event.removed && event.removed.length > 0) {
294-
const indexes = NSMutableArray.new<NSIndexPath>();
295-
for (let index = 0; index < event.removed.length; index++) {
296-
indexes.addObject(NSIndexPath.indexPathForItemInSection(event.index + index, 0));
292+
dispatch_async(main_queue, () => {
293+
view.performBatchUpdatesCompletion(() => {
294+
if (event.addedCount > 0) {
295+
const indexes = NSMutableArray.alloc<NSIndexPath>().init();
296+
for (let index = 0; index < event.addedCount; index++) {
297+
indexes.addObject(NSIndexPath.indexPathForItemInSection(event.index + index, 0));
298+
}
299+
view.insertItemsAtIndexPaths(indexes);
297300
}
298-
this.unbindUnusedCells(event.removed);
299-
if (Trace.isEnabled()) {
300-
CLog(CLogTypes.info, 'deleteItemsAtIndexPaths', indexes.count);
301+
if (event.removed && event.removed.length > 0) {
302+
const indexes = NSMutableArray.new<NSIndexPath>();
303+
for (let index = 0; index < event.removed.length; index++) {
304+
indexes.addObject(NSIndexPath.indexPathForItemInSection(event.index + index, 0));
305+
}
306+
this.unbindUnusedCells(event.removed);
307+
if (Trace.isEnabled()) {
308+
CLog(CLogTypes.info, 'deleteItemsAtIndexPaths', indexes.count);
309+
}
310+
view.performBatchUpdatesCompletion(() => {
311+
view.deleteItemsAtIndexPaths(indexes);
312+
}, null);
301313
}
302-
view.performBatchUpdatesCompletion(() => {
303-
view.deleteItemsAtIndexPaths(indexes);
304-
}, null);
305-
}
306-
}, null);
307-
314+
}, null);
315+
});
308316
return;
309317
}
310318
}
@@ -354,7 +362,9 @@ export class CollectionView extends CollectionViewBase {
354362

355363
// TODO: this is ugly look here: https://github.com/nativescript-vue/nativescript-vue/issues/525
356364
// this.clearRealizedCells();
357-
this.nativeViewProtected.reloadData();
365+
dispatch_async(main_queue, () => {
366+
this.nativeViewProtected.reloadData();
367+
});
358368

359369
const args = {
360370
eventName: CollectionViewBase.dataPopulatedEvent,
@@ -613,7 +623,7 @@ export class CollectionView extends CollectionViewBase {
613623
}
614624

615625
collectionViewNumberOfItemsInSection(collectionView: UICollectionView, section: number) {
616-
return this.items ? this.items.length : 0;
626+
return this.items?.length || 0;
617627
}
618628

619629
collectionViewCellForItemAtIndexPath(collectionView: UICollectionView, indexPath: NSIndexPath): UICollectionViewCell {

0 commit comments

Comments
 (0)