diff --git a/renderer/native/ios/renderer/component/waterfalllist/HippyShadowListView.h b/renderer/native/ios/renderer/component/waterfalllist/HippyShadowListView.h index d055174d6ff..3ff7b045ab2 100644 --- a/renderer/native/ios/renderer/component/waterfalllist/HippyShadowListView.h +++ b/renderer/native/ios/renderer/component/waterfalllist/HippyShadowListView.h @@ -25,30 +25,12 @@ NS_ASSUME_NONNULL_BEGIN -@interface WaterfallItemChangeContext : NSObject - -- (NSHashTable<__kindof HippyShadowView *> *)addedItems; -- (NSHashTable<__kindof HippyShadowView *> *)frameChangedItems; -- (NSSet<__kindof HippyShadowView *> *)deletedItems; -- (NSHashTable<__kindof HippyShadowView *> *)movedItems; - -/// Clear all items recorded. -- (void)clear; - -/// Whether has changed item. -- (BOOL)hasChanges; - -/// Get all chaned items. -- (NSSet *)allChangedItems; - -@end - +/// ListView's shadowView @interface HippyShadowListView : HippyShadowView -///// Whether current ShadowList is dirty. -//@property (nonatomic, assign) BOOL isDirty; - -@property(nonatomic, readonly, strong)WaterfallItemChangeContext *itemChangeContext; +/// Whether current ShadowList is dirty. +/// Used to determine whether the list needs reload. +@property (nonatomic, assign) BOOL isDirty; @end diff --git a/renderer/native/ios/renderer/component/waterfalllist/HippyShadowListView.m b/renderer/native/ios/renderer/component/waterfalllist/HippyShadowListView.m new file mode 100644 index 00000000000..5f482d35a62 --- /dev/null +++ b/renderer/native/ios/renderer/component/waterfalllist/HippyShadowListView.m @@ -0,0 +1,52 @@ +/*! + * iOS SDK + * + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "HippyShadowListView.h" +#import "HippyWaterfallView.h" +#import "HippyAssert.h" + + +@implementation HippyShadowListView + +- (void)insertHippySubview:(HippyShadowView *)subview atIndex:(NSUInteger)atIndex { + [super insertHippySubview:subview atIndex:atIndex]; + if ([subview isKindOfClass:[HippyShadowWaterfallItem class]]) { + HippyShadowWaterfallItem *objectItem = (HippyShadowWaterfallItem *)subview; + objectItem.observer = self; + } + self.isDirty = YES; +} + +- (void)removeHippySubview:(HippyShadowView *)subview { + [super removeHippySubview:subview]; + if ([subview isKindOfClass:[HippyShadowWaterfallItem class]]) { + HippyShadowWaterfallItem *objectItem = (HippyShadowWaterfallItem *)subview; + objectItem.observer = nil; + } + self.isDirty = YES; +} + +- (void)itemFrameChanged:(__kindof HippyShadowWaterfallItem *)item { + self.isDirty = YES; +} + +@end diff --git a/renderer/native/ios/renderer/component/waterfalllist/HippyShadowListView.mm b/renderer/native/ios/renderer/component/waterfalllist/HippyShadowListView.mm deleted file mode 100644 index cf19e5c4556..00000000000 --- a/renderer/native/ios/renderer/component/waterfalllist/HippyShadowListView.mm +++ /dev/null @@ -1,181 +0,0 @@ -/*! - * iOS SDK - * - * Tencent is pleased to support the open source community by making - * Hippy available. - * - * Copyright (C) 2019 THL A29 Limited, a Tencent company. - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import "HippyShadowListView.h" -#import "HippyWaterfallView.h" -#import "HippyAssert.h" - -@interface WaterfallItemChangeContext () { - NSMutableSet *_deletedItems; - NSHashTable *_addedItems; - NSHashTable *_movedItems; - NSHashTable *_frameChangedItems; -} -//append methods -- (void)appendDeletedItem:(HippyShadowView *)objectView; -- (void)appendAddedItem:(HippyShadowView *)objectView; -- (void)appendMovedItem:(HippyShadowView *)objectView; -- (void)appendFrameChangedItem:(HippyShadowView *)objectView; - -@end - -@implementation WaterfallItemChangeContext - -- (instancetype)init { - self = [super init]; - if (self) { - _deletedItems = [NSMutableSet set]; - _addedItems = [NSHashTable weakObjectsHashTable]; - _movedItems = [NSHashTable weakObjectsHashTable]; - _frameChangedItems = [NSHashTable weakObjectsHashTable]; - } - return self; -} - -- (id)copyWithZone:(NSZone *)zone { - WaterfallItemChangeContext *context = [[WaterfallItemChangeContext allocWithZone:zone] init]; - context->_deletedItems = [_deletedItems mutableCopy]; - context->_addedItems = [_addedItems copy]; - context->_movedItems = [_movedItems copy]; - context->_frameChangedItems = [_frameChangedItems copy]; - return context; -} - -- (void)appendDeletedItem:(__kindof HippyShadowView *)objectView { - [_deletedItems addObject:objectView]; -} - -- (void)appendAddedItem:(__kindof HippyShadowView *)objectView{ - [_addedItems addObject:objectView]; -} - -- (void)appendMovedItem:(__kindof HippyShadowView *)objectView { - [_movedItems addObject:objectView]; -} - -- (void)appendFrameChangedItem:(__kindof HippyShadowView *)objectView { - // _frameChangedItems may be also in other addedItems/movedItems - [_frameChangedItems addObject:objectView]; -} - -- (NSSet<__kindof HippyShadowView *> *)deletedItems { - return [_deletedItems copy]; -} - -- (NSMapTable<__kindof HippyShadowView *, NSNumber *> *)addedItems { - return [_addedItems copy]; -} - -- (NSMapTable<__kindof HippyShadowView *, NSValue *> *)movedItems { - return [_movedItems copy]; -} - -- (NSHashTable<__kindof HippyShadowView *> *)frameChangedItems { - return [_frameChangedItems copy]; -} - -- (BOOL)hasChanges { - return _addedItems.count != 0 || _deletedItems.count != 0 || - _movedItems.count != 0 || _frameChangedItems.count != 0; -} - -- (NSSet *)allChangedItems { - NSMutableSet *allChanges = [NSMutableSet set]; - [allChanges addObjectsFromArray:_addedItems.allObjects]; - [allChanges addObjectsFromArray:_deletedItems.allObjects]; - [allChanges addObjectsFromArray:_movedItems.allObjects]; - [allChanges addObjectsFromArray:_frameChangedItems.allObjects]; - return allChanges; -} - -- (void)clear { - [_deletedItems removeAllObjects]; - [_addedItems removeAllObjects]; - [_movedItems removeAllObjects]; - [_frameChangedItems removeAllObjects]; -} - -- (NSString *)description { - NSString *description = [NSString stringWithFormat:@"<%@: %p deleted items: %lu, added items: %lu, moved items: %lu, frame changed items: %lu>", - NSStringFromClass([self class]), - self, - [_deletedItems count], - [_addedItems count], - [_movedItems count], - [_frameChangedItems count]]; - return description; -} - -@end - - -#pragma mark - - -@interface HippyShadowListView () { - WaterfallItemChangeContext *_itemChangeContext; -} - -@end - -@implementation HippyShadowListView - -- (instancetype)init{ - self = [super init]; - if (self) { - _itemChangeContext = [[WaterfallItemChangeContext alloc] init]; - } - return self; -} - -- (WaterfallItemChangeContext *)itemChangeContext { - return _itemChangeContext; -} - -- (void)insertHippySubview:(HippyShadowView *)subview atIndex:(NSUInteger)atIndex { - [super insertHippySubview:subview atIndex:atIndex]; - if ([subview isKindOfClass:[HippyShadowWaterfallItem class]]) { - HippyShadowWaterfallItem *objectItem = (HippyShadowWaterfallItem *)subview; - objectItem.observer = self; - } - [_itemChangeContext appendAddedItem:subview]; -} - -- (void)removeHippySubview:(HippyShadowView *)subview { - [super removeHippySubview:subview]; - if ([subview isKindOfClass:[HippyShadowWaterfallItem class]]) { - HippyShadowWaterfallItem *objectItem = (HippyShadowWaterfallItem *)subview; - objectItem.observer = nil; - } - [_itemChangeContext appendDeletedItem:subview]; -} - -- (void)moveHippySubview:(id)subview toIndex:(NSUInteger)atIndex { - [super moveHippySubview:subview toIndex:atIndex]; - [_itemChangeContext appendMovedItem:subview]; -} - -- (void)itemFrameChanged:(__kindof HippyShadowWaterfallItem *)item { - [_itemChangeContext appendFrameChangedItem:item]; -} - - -@end diff --git a/renderer/native/ios/renderer/component/waterfalllist/HippyShadowWaterfallItem.h b/renderer/native/ios/renderer/component/waterfalllist/HippyShadowWaterfallItem.h index 7c123460d2f..fee091dcf58 100644 --- a/renderer/native/ios/renderer/component/waterfalllist/HippyShadowWaterfallItem.h +++ b/renderer/native/ios/renderer/component/waterfalllist/HippyShadowWaterfallItem.h @@ -29,14 +29,19 @@ NS_ASSUME_NONNULL_BEGIN @protocol HippyShadowWaterfallItemFrameChangedProtocol @required +/// Calledn when item frame changed +/// - Parameter item: shadow waterfall item - (void)itemFrameChanged:(__kindof HippyShadowWaterfallItem *)item; @end +/// Waterfall item's shadowView @interface HippyShadowWaterfallItem : HippyShadowView -@property(nonatomic, assign, getter=isLayoutDirty) BOOL layoutDirty; -@property(nonatomic, weak) id observer; +@property (nonatomic, assign, getter=isLayoutDirty) BOOL layoutDirty; + +/// frame change observer, usually is shadowListView +@property (nonatomic, weak) id observer; @end diff --git a/renderer/native/ios/renderer/component/waterfalllist/HippyShadowWaterfallItem.mm b/renderer/native/ios/renderer/component/waterfalllist/HippyShadowWaterfallItem.m similarity index 100% rename from renderer/native/ios/renderer/component/waterfalllist/HippyShadowWaterfallItem.mm rename to renderer/native/ios/renderer/component/waterfalllist/HippyShadowWaterfallItem.m diff --git a/renderer/native/ios/renderer/component/waterfalllist/HippyWaterfallView.mm b/renderer/native/ios/renderer/component/waterfalllist/HippyWaterfallView.mm index f46f7ddbf61..78925f3d7b3 100644 --- a/renderer/native/ios/renderer/component/waterfalllist/HippyWaterfallView.mm +++ b/renderer/native/ios/renderer/component/waterfalllist/HippyWaterfallView.mm @@ -198,11 +198,11 @@ - (BOOL)isManualScrolling { - (void)hippyBridgeDidFinishTransaction { HippyShadowListView *listNode = self.hippyShadowView; - if (!_dataSource || (listNode && listNode.itemChangeContext.hasChanges)) { - HippyLogTrace(@"🔥 %@ Reload %@", self.hippyTag, [[listNode itemChangeContext] description]); + if (!_dataSource || (listNode && listNode.isDirty)) { + HippyLogTrace(@"🔥 %@ Reload", self.hippyTag); [self cacheVisibleCellViewsForReuse]; [self reloadData]; - [listNode.itemChangeContext clear]; + listNode.isDirty = NO; } }