【问题标题】:ScrollView addSubview: very slowScrollView addSubview:很慢
【发布时间】:2012-06-20 07:03:57
【问题描述】:

我正在使用滚动视图来显示视图控制器视图。如果用户到达缓存视图的末尾,我的方法会重新加载新视图。我的 NSLogs 说该方法已完成,但显示视图需要额外 5 秒。 我认为 [scrollView addSubview:vc.view] 非常非常慢,但我没有发现可以改进它。

整个方法在 -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 中被调用

 scrollView.userInteractionEnabled = NO;

    UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    [activityIndicator setFrame:CGRectMake((320.f*index)+135.f, 151, 50, 50)];
    [activityIndicator setHidesWhenStopped:YES];
    [activityIndicator startAnimating];

    [scrollView addSubview:activityIndicator];

    MBBAppDelegate *delegate = (MBBAppDelegate *)[UIApplication sharedApplication].delegate;

    [delegate fetchDealsWithFilter:dealFilter fromIndex:index toIndex:(index+3) onSuccess:^(id object){

        MBBDealList *list = object;

        int i = 0;

        ProductDetailViewController *vc;

        for (MBBDeal *deal in [list deals]) {

            NSLog(@"start %i",i);
            int indexInArray = i;//[list.deals indexOfObject:deal];

            if (indexInArray+index >= numDeals) {
                return;
            }

            vc = [[ProductDetailViewController alloc] init];

            //fetch the deal and insert
            vc.numberOfDeals = numDeals;
            vc.dealIndex = index+1+indexInArray;
            vc.dealFilter = dealFilter;
            vc.deal = deal;

            vc.view.frame = CGRectMake(320.f*(index+indexInArray), 0.f, 320.f, 436.f);

            [scrollView addSubview:vc.view];

            [productDetailViewControllers insertObject:vc atIndex:(index+indexInArray)];

            i++;
        }
        [activityIndicator stopAnimating];
        scrollView.userInteractionEnabled = YES;

    }];

}

有人知道我可以如何改进我的方法吗?

【问题讨论】:

  • 当您使用 Instruments 分析应用程序时,您发现这 5 秒内大部分时间都花在了哪里?
  • 我应该在 Instruments 中使用哪个预设?我发现没有任何帮助。
  • 这个延迟是因为数据获取过程......
  • 您可以在数据获取完成后在后台线程中编写数据获取过程更新您的 UI,或者在 ViewDidAppear 方法中编写数据获取过程

标签: iphone xcode uiscrollview


【解决方案1】:

从您的问题中我可以理解的是,您用于显示数据获取过程的活动指示器未正确使用。 即使活动指示器消失,您的数据提取过程仍在工作。

您可以为此做两件事: 使用 performSelectorInBackground 方法在后台调用数据获取方法,或者将活动指示器放置在您创建数据获取方法的应用委托中。

【讨论】:

  • 我编辑了我的方法并使用 performSelectorInBackground 重新加载,重新加载需要半秒(如 NSLog),但延迟后仍会显示视图。也许 addSubview: 方法不是最快的方法?我有一个包含滚动视图的 ViewController 并且 reloadMethod 位于其中,所以在 appdelegate 中执行 ActivityIndi​​cator 的东西不是一个选项?!
  • 我又做了一次测量,一次是 7 秒,一次是 8 秒,另一次是 17 秒,但我找不到原因。
  • 在“ViewDidLoad”函数中编写数据获取方法时,视图延迟。如果在“ViewDidAppear”函数中获取数据,可以更快地加载视图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多