改善分段UITableView的加载时间

时间:2011-09-25 01:24:13

标签: objective-c ios uitableview

我正在以模态方式显示UITableView,但它出现大约需要两秒钟,下面是阻止过渡的代码。

ModalViewController.m:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // get all songs from iTunes library
    MPMediaQuery *songQuery = [MPMediaQuery songsQuery];
    // put the songs into an array 
    self.songsArray = [songQuery items];
    // create a sectioned array where songs are sectioned by title
    self.sectionedSongsArray = [self partitionObjects:self.songsArray collationStringSelector:@selector(title)];
}

- (NSArray *)partitionObjects:(NSArray *)array collationStringSelector:(SEL)selector
{
    UILocalizedIndexedCollation *collation = [UILocalizedIndexedCollation currentCollation];
    NSInteger sectionCount = [[collation sectionTitles] count];
    NSMutableArray *unsortedSections = [NSMutableArray arrayWithCapacity:sectionCount];
    for(int i = 0; i < sectionCount; i++)
    {
        [unsortedSections addObject:[NSMutableArray array]];
    }
    for (id object in array)
    {
        NSInteger index = [collation sectionForObject:object collationStringSelector:selector];
        [[unsortedSections objectAtIndex:index] addObject:object];
    }
    NSMutableArray *sections = [NSMutableArray arrayWithCapacity:sectionCount];
    for (NSMutableArray *section in unsortedSections)
    {
        [sections addObject:[collation sortedArrayFromArray:section collationStringSelector:selector]];
    }
    return sections;
}

上面的代码工作正常,但第一次加载模态视图的速度很慢,有没有更好的方法呢?感谢。

1 个答案:

答案 0 :(得分:1)

是的:不要在-viewDidLoad中这样做。一个更好的地方是视图控制器的-init-initWithNibNamed:bundle:或其他什么,并在后台。例如:

- (id)init
{
    self = [super init];
    if(self)
    {
        // ...

        dispatch_async(dispatch_get_global_queue(DISPATCH_PRIORITY_DEFAULT, 0), ^{
            // since it's not on the main thread, you need to create your own autorelease pool to prevent leaks
            NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

            MPMediaQuery *songQuery = [MPMediaQuery songsQuery];
            self.songsArray = [songQuery items];            
            self.sectionedSongsArray = [self partitionObjects:self.songsArray collationStringSelector:@selector(title)];

            // UI calls have to be on the main thread, so we go back to that here
            dispatch_async(dispatch_get_main_queue(), ^{
                if([self isViewLoaded])
                {
                    [self.tableView reloadData];
                }
            });

            // this releases any objects that got autoreleased earlier in the block
            [pool release];
        });
    }

    return self;
}

您的-tableView:numberOfRowsInSection:方法当然应该现在检查sectionedSongsArray是否为非nil,在这种情况下返回0(如果您想要显示“加载”单元格,则返回1你可能应该)。