Odpowiedz na ten temat
Strona 1 z 2 1 2 OstatniaOstatnia
Pokaż wyniki od 1 do 10 z 14

  1. Dołączył
    Jan 2011
    Postów
    6

    Cytuj | #1

    Witam
    Mam aplikację pod iPhone/iPada (objective c). Chciałbym cyklicznie wykonywać jakąś operację (nasuwa się na myśl NSTimer), ale tak, żeby działało też gdy aplikacja działa w tle. Jak coś takiego zrobić.
    1) Zrobiłem testy i niestety NSTimer w tle nie działa. Czy da się to jakoś obejść?
    2) Jest jeszcze UILocalNotification, ale z moich testów wynika, że uruchamia się to np. za 3 sekuny i koniec. Czy da się podpiąć jaką metodę pod UILocalNotification, żeby się wykonała?
    W którą stronę pójść 1), 2) a może coś jeszcze jest, aby uzyskać cykliczne działanie w tle? Dla przykładu niech inkrementuje dowolną liczbę co 3 sekundy...
    Ostatnio edytowane przez thread ; 10.01.2011 o 14:31


  2. Avatar macieks72

    Dołączył
    Aug 2009
    Postów
    9,327

    Cytuj | #2

    Ja sie kiedyś tym bawiłem i o ile pamiętam działało dobrze:

    Taki przykładowy kod:
    Kod:
    @implementation TimerTest2
    - (void) start{
    	NSTimer *timer;
    	timer = [[NSTimer scheduledTimerWithTimeInterval:5.0 
    													  target:self 
    													selector:@selector(onTimer) 
    													userInfo:nil 
    													 repeats:YES] autorelease];
    	[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    }
    
    - (void) onTimer{
    	NSLog(@"Tick!");
    }
    @end
    I drugi:

    Kod:
    @implementation TimerTest
    
    -(void) startTimer
    {
    	NSThread* timerThread = [[NSThread alloc] initWithTarget:self selector:@selector(startTimerThread) object:nil]; //Create a new thread
    	[timerThread start]; //start the thread
    }
    
    //the thread starts by sending this message
    -(void) startTimerThread
    {
    	NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    	NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
    	[NSTimer scheduledTimerWithTimeInterval: 1.0
    									  target: self
    									selector: @selector(timerTick:)
    									userInfo: nil
    									 repeats: YES];
    	
    	[runLoop run];
    	[pool drain];
    }
    
    - (void)timerTick:(NSTimer *)timer
    {
    	NSString *str = [NSString stringWithString:@"Tick!"];
    	NSLog(@"%@", str);	
    	
    	//NSString *str2 = [NSString stringWithContentsOfFile:@"/Users/maciek/Desktop/1.txt"];
    	
    }
    Może coś z tego Ci się przyda.

    Acha, i potem w main() mam takie coś:
    Kod:
    [[NSRunLoop currentRunLoop] run]
    Tylko że ja jestem zupełnie początkujący w obj-c i tak się tylko bawię tym na razie
    Ostatnio edytowane przez macieks72 ; 10.01.2011 o 14:39
    Komputer: Macbook Pro wykąpany w pepsi, teraz Acer Aspire 5750G
    Telefon: iPhone 4 - iOS 5.1.1
    Ludzie, używajcie alta. No chyba że wam obojętne, czy robicie komuś 'łaskę', czy 'laske'.


  3. Dołączył
    Jan 2011
    Postów
    6

    Cytuj | #3

    Dzięki za mega szybką odpowiedź.
    Niestety oba przykłady nie działają;(
    Ad1) Podpiąłem metodę start pod przycisk pod Button i w momencie kliknięcia zamyka się aplikacja. Dopiero gdy wywaliłem "autorelease" z NSTimer to nie wywalał się i zaczął się kręcić. Niestety "w tle" nie kręciło się. Po powrocie do aplikacji zaczyna kręcić się dalej
    Ad2) Kręci się, ale "w tle" niestety nie. Po powrocie również zaczyna się kręcić.

  4. Avatar Roberto
    Dołączył
    Feb 2007
    Skąd
    Wrocław
    Postów
    11,866

    Cytuj | #4

    pytanie też co tak naprawdę chcesz zrobić.
    bo API przecież limituje działanie w tle.

    i musisz przecież wykorzystać to api do multitaskingu (ale na pewno nie to do lokalizacji, chłopie...)
    Komputer: MacBook Pro 13,3" 2,26GHz (Lion 10.7.3)
    Telefon: iPhone 4S
    Tablet: iPad 2 3G
    dlaczego nie korzystasz z opcji szukaj?
    http://ifiboughtyourappalreadycaniup...acappstore.com

  5. Avatar macieks72

    Dołączył
    Aug 2009
    Postów
    9,327

    Cytuj | #5

    Ja się tym bawiłem w aplikacji konsolowej pod osx i mi to działało tak jak chciałem
    Komputer: Macbook Pro wykąpany w pepsi, teraz Acer Aspire 5750G
    Telefon: iPhone 4 - iOS 5.1.1
    Ludzie, używajcie alta. No chyba że wam obojętne, czy robicie komuś 'łaskę', czy 'laske'.

  6. Avatar Roberto
    Dołączył
    Feb 2007
    Skąd
    Wrocław
    Postów
    11,866

    Cytuj | #6

    macieks72 - ba. chociaż lepiej IMO to uruchamiać z osobnego wątku (NSThread) albo w ogóle zrobić do tego wątek osobny (NSTimer jest zatrzymywany np. kiedy włączysz jakieś menu z górnej belki)
    Komputer: MacBook Pro 13,3" 2,26GHz (Lion 10.7.3)
    Telefon: iPhone 4S
    Tablet: iPad 2 3G
    dlaczego nie korzystasz z opcji szukaj?
    http://ifiboughtyourappalreadycaniup...acappstore.com

  7. Avatar macieks72

    Dołączył
    Aug 2009
    Postów
    9,327

    Cytuj | #7

    W drugim przykładzie mam to w wątku właśnie

    Acha czyli całkiem bez NSTimer-a, nawet gdy jest w osobnym wątku, tak?
    Ostatnio edytowane przez macieks72 ; 10.01.2011 o 15:46
    Komputer: Macbook Pro wykąpany w pepsi, teraz Acer Aspire 5750G
    Telefon: iPhone 4 - iOS 5.1.1
    Ludzie, używajcie alta. No chyba że wam obojętne, czy robicie komuś 'łaskę', czy 'laske'.

  8. Avatar Roberto
    Dołączył
    Feb 2007
    Skąd
    Wrocław
    Postów
    11,866

    Cytuj | #8

    jeżeli wykorzystujemy do tego osobny wątek to szczerze mówiąc nie wiem po co w sumie używać NSTimer'a do tego, skoro można to wszystko zrobić w wątku (w tym ustawić uśpienie na jakiś tam czas).
    ale może coś mi tutaj umyka ;]
    Komputer: MacBook Pro 13,3" 2,26GHz (Lion 10.7.3)
    Telefon: iPhone 4S
    Tablet: iPad 2 3G
    dlaczego nie korzystasz z opcji szukaj?
    http://ifiboughtyourappalreadycaniup...acappstore.com

  9. Avatar macieks72

    Dołączył
    Aug 2009
    Postów
    9,327

    Cytuj | #9

    Też racja
    Komputer: Macbook Pro wykąpany w pepsi, teraz Acer Aspire 5750G
    Telefon: iPhone 4 - iOS 5.1.1
    Ludzie, używajcie alta. No chyba że wam obojętne, czy robicie komuś 'łaskę', czy 'laske'.


  10. Dołączył
    Jan 2011
    Postów
    6

    @Roberto, @macieks72
    Czyli to zadziała? To znaczy, że "nowy wątek" będzie działał w tle i dodatku może coś cyklicznie robić? Może na początek coś wyświetlać lub dodawać przysłowiową jedynkę.

Odpowiedz na ten temat
Strona 1 z 2 1 2 OstatniaOstatnia