Идея таймера будет работать. Вызывайте uploadOutstandingObjects вашего класса менеджера данных через таймер с некоторым интервалом, который подходит для вашего приложения
Скажем, у вас есть сущность 'Foo', которую нужно загрузить. Вы можете выполнить следующее в своем классе менеджера данных ...
- (void)uploadOutstandingObjects {
// I use the great MagicalRecord class for Core Data fetching
// https://github.com/magicalpanda/MagicalRecord
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status == pending"]
NSArray *outstandingObjects = [Foo MR_findAllWithPredicate:predicate];
for (Foo *foo in outstandingObjects) {
[foo uploadToServer];
}
Один из способов сделать это - использовать уведомления. Всякий раз, когда вы начинаете загрузку, вы заставляете этот объект слушать уведомление «uploadsStopped». После завершения загрузки загружаемый объект перестанет слушать.
Класс Foo:
- (void)uploadFailed {
// change status to upload pending in the database for this 'foo' object
}
- (void)uploadComplete {
// change status to upload complete in the database for this 'foo' object
}
-(void)uploadToServer {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(uploadFailed:)
name:@"uploadsStoppedNotification"
object:nil ];
// perform upload. If you are doing this synchronously...
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:<url here>];
[request startSynchronously];
if (![request error]) {
[self uploadSucceeded];
// stop listening to global upload notifications as upload attempt is over
[NSNotificationCenter removeObserver:self];
}
else {
[self uploadFailed];
// stop listening to global upload notifications as upload attempt is over
[NSNotificationCenter removeObserver:self];
}
Если ваше приложение закрывается, вы можете справиться с изменением статуса объектов «загрузки», которые еще не завершены.
- (void)applicationDidEnterBackground:(UIApplication *)application {
// this will fire to any objects which are listening to
// the "uploadsStoppedNotification"
[[NSNotificationCenter defaultCenter]
postNotificationName:@"uploadsStoppedNotification"
object:nil ];