Aszinkron feladatvégzés I. – iOS

Más keretrendszerekkel szemben az iOS-ről nem derül ki első ránézésre, hogy miként támogatja az aszinkron feladat végrehajtást. Amint nekiállunk és elkezdjük tanulmányozni a különféle lehetőségeket, csakhamar feltűnik, hogy mindez azért van így, mert alapértelmezett módon aszinkron valamennyi tevékenység (illetve majdnem valamennyi).

De miért fontos mindez nekünk? Röviden összefoglalva  azért mert ennek tudatában megfelelő módon fenn tudjuk tartani a telefonra jellemző reszponzivítást alkalmazásainkban. Soha nem fordul elő, hogy a telefon nem reagál majd valamely felhasználó által kezdeményezett interakcióra.

Ez a cikksorozat abban ad segítséget, hogy ezt a fajta gondolkodást minél jobban érvényre tudjuk juttatni majdani alkalmazásainkban.

Aszinkron animációk

Mint ahogy azt egy korábbi már megnéztük, a UIKit egy könnyen kezelhető módszert ad egyszerű animációk megvalósítására. Első ránézésre talán fel sem tűnt, de mindez tökéletesen aszinkron módon történik, azaz mialatt az animáció fut, a felület teljes mértékig reszponzív marad. Nézzünk meg egy példát, amelyben az animációk futása közben a háttér felület érintésre megváltoztatja a színét.

http://www. youtube. com/watch?v=p2SakUKAadg

A forráskód lényegi részeit az alábbiakban kiemeltem, de aki ki szeretné próbálni letöltheti a teljes projektet.

// animáció definiálása és elindítása
- (void)processAnimation:(UIView *)tile
{
    tile. center = CGPointMake(-50, 60);
    // a context-ben átadjuk az animált UI elemet
    [UIView beginAnimations:@"123" context:(__bridge void *)tile];
    // --- animáció vége esemény beállítása
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
    [UIView setAnimationCurve:UIViewAnimationCurveLinear];
    // --- animáció időtartam beállítás, FONTOS, hogy ezt előbb kell beállítani, mint az anmációs lépéseket!!!
    [UIView setAnimationDuration:0. 99];
    // --- animációs lépések végrehajtása
    // vizszintes mozgatás
    tile. center = CGPointMake(370, 60);
    // Commit the changes and perform the animation. [UIView commitAnimations];

}

// animáció végeztével újraindítás
- (void) animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    UIView *tile = (__bridge UIView *)context;
    [self processAnimation:tile];
}

// app indítását követően animáció indítása
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    UIView *tile = [[UIView alloc]initWithFrame:CGRectMake(10, 10, 100, 100)];
    [tile setBackgroundColor:[UIColor redColor]];
    [self. view addSubview:tile];

    [self processAnimation:tile];
}

// az alap view-ra elhelyezett tap gesture recognizer action-je
- (IBAction)tapScreen:(id)sender {
    if (self. view. backgroundColor == [UIColor blackColor]) {
        [self. view setBackgroundColor:[UIColor yellowColor]];
    } else {
        [self. view setBackgroundColor:[UIColor blackColor]];
    }
}

Időzitők használata

Egy másik gyakran felmerülő probléma, amikor több animációt valahogyan egymáshoz szinkronizálva szeretnénk indítani, adott esetben egymás után adott időközönként. A következőkben erre nézünk példát, ahol néhány négyzetet animálunk majd.

// animáció végeztével beállítjuk a négyzet színét zöldre
- (void) animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    UIView *tile = (__bridge UIView *)context;
    [tile setBackgroundColor:[UIColor greenColor]];
}

// animáció definiálása
- (void)processAnimation
{
    UIView *tile = [[UIView alloc]initWithFrame:CGRectMake(10, 10, 100, 100)];
    [tile setBackgroundColor:[UIColor redColor]];
    tile. alpha=0;
    [self. view addSubview:tile];
    // a context-ben megadjuk magát az animált UI elemet,
    // melyet majd az animáció vége eseményben megkapunk
    [UIView beginAnimations:@"123" context:(__bridge void *)tile];
    // --- animáció vége esemény beállítása
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    // --- animáció időtartam beállítás, FONTOS, hogy ezt előbb kell beállítani, mint az anmációs lépéseket!!!
    [UIView setAnimationDuration:0. 99];
    // --- animációs lépések végrehajtása
    tile. At writer's relief we work with our clients to write strong query letters, and we advise them on strategies and  tactics regarding the submission process. alpha = 1;
    tile. center = CGPointMake(300, 400);
    // Commit the changes and perform the animation. [UIView commitAnimations];

}

// animációk indítása adott időközönként egymás után
// FONTOS! az animációk aszinkron futnak, így a következő program
// sorok már mind lefutnak amikor az első négyzetünk elindul. - (void)manageAnimations
{
    [self processAnimation];
    [self performSelector:@selector(processAnimation)
      withObject:nil afterDelay:0. 3];
    [self performSelector:@selector(processAnimation)
      withObject:nil afterDelay:1];
    [self performSelector:@selector(processAnimation)
      withObject:nil afterDelay:1. 2];
}

.

Kategória: Általános | A közvetlen link.