gpt4 book ai didi

ios - 传递参数使代码运行 "slower"?

转载 作者:行者123 更新时间:2023-11-29 12:51:34 24 4
gpt4 key购买 nike

背景资料
目前我正在为每个 UITableViewCell 设置文本在我的UITableView使用以下代码:
情景一:cell.textLabel.attributedText = [news formattedSubject];但是,考虑一下我是否要为 formattedSubject 添加一个参数定义,只是一个整数参数,所以现在的代码是:
场景 B:cell.textLabel.attributedText = [news formattedSubject:1];每个表格 View 单元格中的文本长度大约为 3-5 行,从外部源读取并通过 JSON 进行解析。这是 的示意图期望的结果,这就是场景 A 中发生的情况:
场景A流程图:
enter image description here
图像 A 仅显示默认的空 UITableView当应用程序仍在加载 JSON 数据时我得到的。应用程序检索并解析此数据后,将数据填充到 UITableView ,从而得到图像 B。这是期望的(和预期的)结果。
但是,如果我将参数添加到 formattedSubject ,我得到了下面的流程图:
场景 B 流程图:
enter image description here
再次,图像 A 显示默认 UITableView .然而,问题在于图像 B 中发生的情况。 在图像 B 中,数据已被解析,但尚未被 formattedSubject 正确格式化。 , 从而产生一个单一的、水平窄的、冗长的无格式文本行。 几分之一秒后,应用程序看起来像 Image C,最终结果显示了解析后的格式化数据。
我的问题:
我所做的唯一更改是在 formattedSubject 中添加了一个参数。 . 也就是我改了-(NSAttributedString*)formattedSubject {-(NSAttributedString*)formattedSubject:(int)state { . formattedSubject 内什么都没有也没关系实际使用 state整数,我仍然从场景 B 中得到结果。
这种变化似乎使代码运行得更慢了。它会在数据解析和格式化并显示在 UITableView 中之间产生延迟。 .我很好奇为什么会这样,以及如何解决/规避这个问题。
除了美学问题, 中发生了什么场景B 当用户到达 UITableView 末尾时,还会干扰我自动加载新数据。 .由于文本行横向变窄,最后一行数据将暂时显示在 UITableView 中。首次加载时,从而导致应用程序启动时数据被检索两次 .
我离编码专家还差得很远,因此对我来说,如何简单地将参数添加到我的 NSAttributedString 完全没有意义。可能会造成上述延迟。如果有人可以,我将不胜感激:

  • 解释为什么这正在发生,
  • 提供解决此问题的解决方案。

  • 非常感谢您阅读本文,欢迎任何和所有评论/帮助。
    编辑 1:@Vijay-Apple-Dev.blogspot.com,@txulu
    这是我的 formattedSubject 代码:
    -(NSAttributedString*)formattedSubject:(int)state {
    if(formattedSubject!=nil) return formattedSubject;
    NSDictionary *boldStyle = [[NSDictionary alloc] init];
    if(state==1) {
    boldStyle = @{NSFontAttributeName:[UIFont fontWithName:@"Helvetica-Bold" size:16.0],NSForegroundColorAttributeName:[UIColor colorWithRed:0.067 green:0.129 blue:0.216 alpha:1.0]};
    }
    else {
    boldStyle = @{NSFontAttributeName:[UIFont fontWithName:@"Helvetica-Bold" size:16.0],NSForegroundColorAttributeName:[UIColor whiteColor]};
    }
    NSDictionary* normalStyle = @{NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:14.0]};
    NSMutableAttributedString* articleAbstract = [[NSMutableAttributedString alloc] initWithString:subject];
    [articleAbstract setAttributes:boldStyle range:NSMakeRange(0, subject.length)];
    [articleAbstract appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n"]];
    int startIndex = [articleAbstract length];
    NSTimeInterval _interval=[datestamp doubleValue];
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:_interval];
    NSDateFormatter *_formatter=[[NSDateFormatter alloc]init];
    [_formatter setDateFormat:@"MM/dd/yy"];
    NSString* description = [NSString stringWithFormat:@"By %@ on %@",author,[_formatter stringFromDate:date]];
    [articleAbstract appendAttributedString:[[NSAttributedString alloc] initWithString: description]];
    [articleAbstract setAttributes:normalStyle range:NSMakeRange(startIndex, articleAbstract.length - startIndex)];
    formattedSubject = articleAbstract;
    return formattedSubject;
    }
    请注意,正如我之前所说,即使我实际上没有使用 state参数,我仍然得到相同的结果。
    这是我的 cellForRowAtIndexPath 代码:
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    News *news = newsArray[indexPath.row];

    NSIndexPath *selectedIndexPath = [tableView indexPathForSelectedRow];
    if([selectedIndexPath isEqual:indexPath]) {
    cell.textLabel.attributedText = [news formattedSubject:1];
    }
    else {
    cell.textLabel.attributedText = [news formattedSubject:0];
    }

    cell.textLabel.numberOfLines = 0;
    cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
    UIView *selectedBackgroundViewForCell = [UIView new];
    [selectedBackgroundViewForCell setBackgroundColor:[UIColor colorWithRed:0.169 green:0.322 blue:0.525 alpha:1.0]];
    cell.selectedBackgroundView = selectedBackgroundViewForCell;
    cell.textLabel.highlightedTextColor = [UIColor whiteColor];
    if (indexPath.row == [newsArray count] - 1) {
    [self parseJSON];
    }
    return cell;
    }
    请让我知道我是否可以发布其他可能有帮助的内容。
    编辑2:
    我不确定是否存在性能问题。经过进一步测试,我倾向于认为在场景 A 中,应用程序会加载和格式化单元格数据 之前 显示它,而在场景 B 中,应用程序加载数据,将其显示在 UITableViewCell , 和 然后 格式化它,这会产生我上面详述的问题。
    有些人在我的 parseJSON 中提出了代码方法,所以我在这里发布以供引用。如您所见,我确实实现了多线程,以防止数据加载滞后于应用程序。
    -(void)parseJSON
    {
    loading.alpha = 1;
    loading.image = [UIImage imageNamed:@"loading.png"];
    activityIndicator.alpha = 1;
    timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(checkLoading) userInfo:nil repeats:YES];

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
    dispatch_async(queue, ^{
    parseNumber = parseNumber + 1;
    int offset = parseNumber*20-1;
    NSString *URLString = [NSString stringWithFormat:@"http://feedurl.com/feed.php?offset=%d",offset];
    NSURL *url=[NSURL URLWithString:URLString];
    NSData *data=[NSData dataWithContentsOfURL:url];
    NSError* error;
    if(data!=nil) {
    json = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingMutableContainers error: &error];
    for(NSDictionary *newsInfo in json) {
    News *newsList = [[News alloc] init];
    newsList.thread = newsInfo[@"thread"];
    newsList.author = newsInfo[@"author"];
    newsList.subject = newsInfo[@"subject"];
    newsList.body= newsInfo[@"body"];
    newsList.datestamp = newsInfo[@"datestamp"];
    [jsonTemp addObject:newsList];
    }
    newsArray = jsonTemp;
    }
    dispatch_sync(dispatch_get_main_queue(), ^{
    if(data!=nil) {
    [newsTable reloadData];
    }
    else {
    activityIndicator.alpha = 0;
    loading.image = [UIImage imageNamed:@"error.png"];
    [self startTimer];
    }
    });
    });
    }

    最佳答案

    编辑:

    好的,调用 [news formattedSubject] 时有区别而不是 [news formattedSubject:1] .第一个就像做news.formattedSubject ,即访问立即返回 ivar 的 formattedSubject 属性,速度非常快。第二个调用更复杂的 formattedSubject:执行您发布的代码的方法,速度较慢。

    原文:

    您的代码看起来不错,除了一些小细节,例如:

    NSDictionary *boldStyle = [[NSDictionary alloc] init];

    没有必要,因为您在之后分配:
    boldStyle = @{NSFontAttributeName ...}

    另外,我猜可能导致您的问题是:
    if (indexPath.row == [newsArray count] - 1) {
    [self parseJSON];
    }

    在你的 cellForRowAtIndexPath: 中调用它可能是一个严重的性能问题。如果此方法做了很多工作并且不在后台进行,则可能会导致您提到的延迟。根据经验,您永远不应该在主线程中进行网络/数据处理(系统将始终在该线程中调用 cellForRowAtIndexPath)。

    关于ios - 传递参数使代码运行 "slower"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22320930/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com