iOS: optimze when updating cell do not cause size change, do not reload

This commit is contained in:
pengfei.zhou 2021-10-20 17:49:46 +08:00 committed by osborn
parent c04994ab21
commit 72a4562885
4 changed files with 35 additions and 0 deletions

View File

@ -295,13 +295,23 @@ - (void)blendSubNode:(NSDictionary *)subModel {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
NSString *viewId = subModel[@"id"]; NSString *viewId = subModel[@"id"];
DoricViewNode *viewNode = [self subNodeWithViewId:viewId]; DoricViewNode *viewNode = [self subNodeWithViewId:viewId];
BOOL skipReload = NO;
if (viewNode) { if (viewNode) {
CGSize originSize = viewNode.view.frame.size;
[viewNode blend:subModel[@"props"]]; [viewNode blend:subModel[@"props"]];
[viewNode.view.doricLayout apply];
[viewNode requestLayout];
if (CGSizeEqualToSize(originSize, viewNode.view.frame.size)) {
skipReload = YES;
}
} else { } else {
NSMutableDictionary *model = [[self subModelOf:viewId] mutableCopy]; NSMutableDictionary *model = [[self subModelOf:viewId] mutableCopy];
[self recursiveMixin:subModel to:model]; [self recursiveMixin:subModel to:model];
[self setSubModel:model in:viewId]; [self setSubModel:model in:viewId];
} }
if (skipReload) {
return;
}
[self.itemViewIds enumerateKeysAndObjectsUsingBlock:^(NSNumber *_Nonnull key, NSString *_Nonnull obj, BOOL *_Nonnull stop) { [self.itemViewIds enumerateKeysAndObjectsUsingBlock:^(NSNumber *_Nonnull key, NSString *_Nonnull obj, BOOL *_Nonnull stop) {
if ([viewId isEqualToString:obj]) { if ([viewId isEqualToString:obj]) {
*stop = YES; *stop = YES;

View File

@ -63,6 +63,11 @@ - (instancetype)init {
return self; return self;
} }
- (void)setText:(NSString *)text {
[super setText:text];
self.placeholderLabel.hidden = self.text.length > 0;
}
- (void)layoutSubviews { - (void)layoutSubviews {
[super layoutSubviews]; [super layoutSubviews];
self.placeholderLabel.hidden = self.text.length > 0; self.placeholderLabel.hidden = self.text.length > 0;

View File

@ -279,13 +279,23 @@ - (void)blendSubNode:(NSDictionary *)subModel {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
NSString *viewId = subModel[@"id"]; NSString *viewId = subModel[@"id"];
DoricViewNode *viewNode = [self subNodeWithViewId:viewId]; DoricViewNode *viewNode = [self subNodeWithViewId:viewId];
BOOL skipReload = NO;
if (viewNode) { if (viewNode) {
CGSize originSize = viewNode.view.frame.size;
[viewNode blend:subModel[@"props"]]; [viewNode blend:subModel[@"props"]];
[viewNode.view.doricLayout apply:CGSizeMake(self.view.width, self.view.height)];
[viewNode requestLayout];
if (CGSizeEqualToSize(originSize, viewNode.view.frame.size)) {
skipReload = YES;
}
} else { } else {
NSMutableDictionary *model = [[self subModelOf:viewId] mutableCopy]; NSMutableDictionary *model = [[self subModelOf:viewId] mutableCopy];
[self recursiveMixin:subModel to:model]; [self recursiveMixin:subModel to:model];
[self setSubModel:model in:viewId]; [self setSubModel:model in:viewId];
} }
if (skipReload) {
return;
}
[self.itemViewIds enumerateKeysAndObjectsUsingBlock:^(NSNumber *_Nonnull key, NSString *_Nonnull obj, BOOL *_Nonnull stop) { [self.itemViewIds enumerateKeysAndObjectsUsingBlock:^(NSNumber *_Nonnull key, NSString *_Nonnull obj, BOOL *_Nonnull stop) {
if ([viewId isEqualToString:obj]) { if ([viewId isEqualToString:obj]) {
*stop = YES; *stop = YES;

View File

@ -227,13 +227,23 @@ - (DoricViewNode *)subNodeWithViewId:(NSString *)viewId {
- (void)blendSubNode:(NSDictionary *)subModel { - (void)blendSubNode:(NSDictionary *)subModel {
NSString *viewId = subModel[@"id"]; NSString *viewId = subModel[@"id"];
DoricViewNode *viewNode = [self subNodeWithViewId:viewId]; DoricViewNode *viewNode = [self subNodeWithViewId:viewId];
BOOL skipReload = NO;
if (viewNode) { if (viewNode) {
CGSize originSize = viewNode.view.frame.size;
[viewNode blend:subModel[@"props"]]; [viewNode blend:subModel[@"props"]];
[viewNode.view.doricLayout apply:CGSizeMake(self.view.width, self.view.height)];
[viewNode requestLayout];
if (CGSizeEqualToSize(originSize, viewNode.view.frame.size)) {
skipReload = YES;
}
} else { } else {
NSMutableDictionary *model = [[self subModelOf:viewId] mutableCopy]; NSMutableDictionary *model = [[self subModelOf:viewId] mutableCopy];
[self recursiveMixin:subModel to:model]; [self recursiveMixin:subModel to:model];
[self setSubModel:model in:viewId]; [self setSubModel:model in:viewId];
} }
if (skipReload) {
return;
}
[self.itemViewIds enumerateKeysAndObjectsUsingBlock:^(NSNumber *_Nonnull key, NSString *_Nonnull obj, BOOL *_Nonnull stop) { [self.itemViewIds enumerateKeysAndObjectsUsingBlock:^(NSNumber *_Nonnull key, NSString *_Nonnull obj, BOOL *_Nonnull stop) {
if ([viewId isEqualToString:obj]) { if ([viewId isEqualToString:obj]) {
*stop = YES; *stop = YES;