У меня обычно есть класс Factory, который отвечает за соединение всех объектов. Фабрика создается делегатом приложения в applicationDidFinishLaunching:
- (void) applicationDidFinishLaunching: (UIApplication*) app {
// Creates all the objects that are needed to wire
// the application controllers. Can take long. We are
// currently displaying the splash screen, so that we
// can afford to block for a moment.
factory = [[Factory alloc] init];
// Now that we have the building blocks, we can wire
// the home screen and start the application.
home = [[factory wireHomeScreen] retain];
[window addSubview:home.view];
[window makeKeyAndVisible];
}
Теперь, если создание Фабрики занимает много времени, я просто жду под заставкой или выкладываю другой вид, отображающий счетчик, пока все не будет готово. Я полагаю, вы могли бы использовать эту схему, если вы можете выполнить инициализацию синхронно:
@implementation Factory
- (id) init {
[super init];
// Takes long, performs the network I/O.
someDataSource = [[DataSource alloc] init…];
return self;
}
- (id) wireHomeScreen {
// Data source already loaded or failed to load.
HomeScreen *home = [[HomeScreen alloc] init…];
[home setDataSource:someDataSource];
return [home autorelease];
}
@end
Если повезет, в вашей процедуре запуска будет всего одна длинная операция, так что вы ничего не потеряете, сериализовав init.
Если вы хотите выполнить инициализацию источника данных в фоновом режиме, вы можете отобразить некоторый вводный экран, который будет запускать домашний экран после загрузки данных:
- (void) applicationDidFinishLaunching: (UIApplication*) app
{
// Create the basic building blocks to wire controllers.
// Will not load the data from network, not yet.
factory = [[Factory alloc] init];
// Display something while the data are being loaded.
IntroScreen *intro = [[IntroScreen alloc] init];
// Main screen, will get displayed once the data are loaded.
home = [[factory wireHomeScreen] retain];
// The intro screen has to know what do display next.
[intro setNextScreen:home];
// Start loading data and then notify the intro screen
// that we are done loading and the show can begin.
[factory.someDataSource startLoadingAndNotify:intro];
[window addSubview:intro.view];
[window makeKeyAndVisible];
}
Теперь, когда источник данных завершит загрузку данных, он сообщит экрану заставки, чтобы он воспроизводил реальный контент (в данном случае домашний экран). Это всего лишь грубый набросок (например, в реальном случае управление памятью может отличаться), но в принципе все должно работать нормально.