Я работал над проектом iOS, который использовал загрузку данных в фоновом режиме. Что ж, честно скажу - реализация была не самой лучшей (и была изменена позже, чтобы убрать такой неочевидный шаблон), и у меня возникли некоторые проблемы с неотменяемыми объектами, и я не могу сказать, что документы дали мне четкое понимание о том, что происходит. Код, демонстрирующий общую идею:
- (void)loadModelAtIndex:(NSUInteger)index {
Model *model = [self modelAtIndex:index];
if (model) {
model.index = index;
[self performSelectorInBackgroundThread:@selector(loadModelInBackgroundThread) withObject:model]
}
}
- (void)loadModelInBackgroundThread:(Model *)model {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
model.data = [NSData dataWithContentsOfURL:model.url];
//and some other changes can be here
[self performSelectorOnMainThread:@selector(modelDidLoad) withObject:model waitUntilDone:NO]'
[pool drain];
}
- (void)modelDidLoad:(Model *)model {
[self saveModel:model atIndex:model.index];
[self loadModelAtIndex:model.index + 1];
}
Ну, почти все время это работало, как ожидалось. За исключением случаев, когда вызывающий абонент был освобожден при загрузке в фоновом режиме - объект модели остался в памяти, но не был освобожден (в этот момент у меня растет память).
Может кто-нибудь объяснить мне, что произойдет в случае освобождения, пока работает фоновый поток? Я не уверен, что этот код может подойти вообще, но все же заинтересован. Любая модификация заставит вещи работать хорошо?