Да: не делай этого в -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, если вы хотите отобразить ячейку «загрузки», что вам, вероятно, следует).