Door het invoeren van multitasking in IOS-4 stopt je app niet meer bij het sluiten van het appvenster. Dit betekent dat bij het heropenen van de app er niet meer vanaf “nul” begonnen wordt, maar gewoon wordt verder gedaan.
Maar wat doe je nu als je wil dat bij elk openen van de app een bepaalde taak wordt uitgevoerd? In mijn geval was dit een communicatie starten met de server om verse data op te halen.
De oplossing was reeds gedeeltelijk klaar in de app omdat ik bij de ViewControllers reeds overal een methode “refresh” had geschreven. Deze methode werd aanroepen wanneer ik nieuwe data had opgehaald om die te kunnen tonen. Er zit echter een probleempje achter de muur te loeren : als ik in de refresh methode nu de methode ga oproepen om verse data op te halen, dat op zijn beurt de refresh methode gaat oproepen, zit ik met een vicieuze cirkel (of om het in programmeertermen uit te drukken : een oneindige lus).
De oplossing voor dat klein probleempje is gewoon een argument toevoegen aan de methode’refresh’. Dit argument is een string waar ik “activated” zal inplaatsen als het aanroepen wordt vanuit het deel dat detecteert dat de app weer geactiveerd werd (komt wat later in deze uitleg). In alle andere gevallen steek ik er een andere string in. Dan ziet de ‘refresh methode’ eruit als
- (void)refresh:(NSString *)status{
appDelegate = (mijnAppDelegate *)[[UIApplication sharedApplication] delegate];
NSUserDefaults *instellingen = [appDelegate instellingen];
dagOfWeek = [instellingen stringForKey:@"dagweek"];
// nu sturen we een vraag naar de server
if ([status isEqualToString:@"activated"]) {
[appDelegate vraagServerAsync:self];
}
if ([dagOfWeek isEqualToString:@"dag"]) {
[dagKalenderViewController refresh];
} else {
[weekKalenderViewController refresh];
}
}
Je merkt dat de async methode (ophalen van nieuwe data) slechts wordt aanroepen als de string “activated” is.
Nu komt het 2-de deel van de oplossing : Hoe weet ik dat de applicatie werd geactiveerd?
voeg gewoon de onderstaande methode toe aan de appDelegate:
- (void)applicationDidBecomeActive:(UIApplication *)application {
/*
Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
*/
[deze_viewController refresh:@"activated"];
}
Geplaatst in Development, iPhone
Tags: multi-tasking, multitasking, tip