UIScrollView 占用太多时间

UIScrollView taking too much time

提问人:Hash.Techniq 提问时间:9/2/2013 最后编辑:markoHash.Techniq 更新时间:9/2/2013 访问量:400

问:

我试图在我的应用程序中放置一个有 1000,000 条记录的 ScrollView,这个 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);
    }

}

请指教。

iOS Objective-C UIscrollView iOS4

评论

1赞 BooRanger 9/2/2013
假设您需要使用 collectionView,它的工作方式类似于 tableView,并回收一些视图,而不是创建 10,000 个视图。如果您不使用 iOs 6,请查看此库 github.com/steipete/PSTCollectionView,一些家伙制作了适用于 iOS4.3+ 的开源版本。
0赞 BooRanger 9/2/2013
此外,一些简单的事情,比如用颜色保留变量,不调用 nslog 可能会加快速度。
0赞 Prashant Nikam 9/2/2013
我建议..与其在开始时加载所有记录,不如最初只加载几条记录,然后在用户滚动时继续向其中添加记录并删除以前的记录,这将消耗更少的内存.....这个想法类似于 tableView 的单元格重用概念。
0赞 Saurabh Passolia 9/2/2013
对于此类实现,您必须使用 UITableView 而不是 UIScrollview。

答:

0赞 Iducool 9/2/2013 #1

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

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

您正在加载大量记录。实际上,您不应该一次加载所有记录。您应该使用类似于 tableview 的机制,即仅加载那些位于滚动视图可见区域中的记录。在滚动之前不要加载新行,您应该重用行或视图,以便加快滚动速度。

评论

0赞 Hash.Techniq 9/2/2013
U ROCK,我有了 UR 的想法,这就是我要做的事情:)
0赞 Hash.Techniq 9/2/2013
当滚动结束时,你有什么简单的方法可以滚动其他人吗?
0赞 Iducool 9/2/2013
不知道你在问什么。
0赞 marko 9/2/2013
你在这里实现的只是以后用长时间的操作来阻塞你的 UI 线程 - 这也会导致糟糕的用户体验。
1赞 jrturton 9/2/2013
“我需要滚动视图,因为我在每行 32 个大小为 10x10 的分离按钮中显示,您的建议是什么?”我的建议是,重新设计你的应用程序,这听起来像是一场可用性灾难。
0赞 marko 9/2/2013 #2

Apple 的文档非常明确,滚动的视图应该是平铺的,您的应用程序在视图滚动时提供平铺。UIScrollView

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

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

虽然这需要很长时间并不奇怪,但您的应用程序没有因使用过多内存而被终止,这更是一个谜。

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

0赞 Anuj 9/2/2013 #3

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

0赞 MANCHIKANTI KRISHNAKISHORE 9/2/2013 #4

一旦尝试这个 更改代码

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

评论

0赞 marko 9/2/2013
顺便说一句:应该是-(void) viewDidLoad()