UIScrollView花费了太多时间

时间:2013-09-02 08:26:36

标签: ios objective-c uiscrollview ios4

我正在尝试将ScrollView放在我的应用程序中,该应用程序有1000,000个记录,这个scrollView将在应用程序启动时加载,因此应用程序直到百万1000 000记录才运行需要花费大量时间,我很想知道有没有办法在加载记录时显示应用程序和scrollView(在添加其记录时显示scrollView),在代码下面使用:

    - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self loadIt];
}

- (void)loadIt{

    float startX = 0;
    float startY = 0;
    [_bigScroll setContentSize:CGSizeMake(320, 312500)];
    _bigScroll.pagingEnabled = NO;
    for (counter=0; counter<999999; counter++)
    {
        UIButton *tester=[[UIButton alloc] initWithFrame:CGRectMake(startX, startY, 10, 10)];

        if (counter % 2 == 0) {

            [tester setBackgroundColor:[UIColor whiteColor]];

        }
        else
        {

            [tester setBackgroundColor:[UIColor grayColor]];
        }

        [_bigScroll addSubview:tester];
        [tester release];

        if (startX == 320) {
            startX = 0;
            startY += 10;
        }
        else
            startX += 10;

        NSLog(@"counter  =  %d", counter);
    }

}

请建议。

4 个答案:

答案 0 :(得分:0)

在加载记录时有没有办法显示应用程序和scrollView?

尝试使用[self performSelector:@selector(loadIt) withObject:nil]; or [self performSelector:@selector(loadIt) withObject:nil afterDelay:0.2];
在执行此方法之前,它不会阻止您的UI。

您正在加载大量记录。实际上你不应该在当时加载所有记录。你应该使用像tableview这样的机制,只使用那些在scrollview的可见区域中的记录。在滚动之前不要加载新行,您应该重复使用行或视图,以便加快滚动速度。

答案 1 :(得分:0)

Apple UIScrollView CALayer非常清楚滚动的视图应该是平铺的,应用程序在视图滚动时提供切片。

管理滚动视图中显示的内容绘制的对象应平铺内容的子视图,以使视图不超出屏幕大小。当用户在滚动视图中滚动时,此对象应根据需要添加和删除子视图。

这对于性能和内存使用都是必需的:可滚动视图由UIButton支持,而UITableView又由位图支持。对于每个创建的UICollectionView个对象也是如此。

虽然这需要很长时间并不奇怪,但是因为使用太多内存而你的应用程序还没有被终止,这更加神秘。

{{1}}和{{1}}都是平铺其内容的视图示例。您可能会发现可以使用其中一个来实现您的要求,如果没有,请遵循他们使用的模型。

答案 2 :(得分:0)

您无需创建1000,000个观看次数。您可以动态创建视图并删除在屏幕空间不可见的先前视图。因此,在滚动时,您可以创建新视图并删除那些超出屏幕可见区域的视图。 这将帮助您节省内存,否则无论您是否在项目中使用ARC,如果您在内存中加载了大量的视图,肯定会有崩溃的机会,ARC在这种情况下无法帮助您。

答案 3 :(得分:0)

尝试此操作后更改

中的代码
-viewdidload()
{
    [self loadIt];//change this to 
    [self performSelectorInBackground:@selector(loadIt) withObject:nil];
}