2012-01-20 31 views
11

Arka planda çalışması gereken bir uygulama geliştiriyorum. Bu konum tabanlı bir uygulama, bu yüzden her zaman çalışır, OS onu öldürmez.iphone - Arka planda NSTimers

Her 10 saniyede bir bilgi göndermelidir (yalnızca hata ayıklama için), arka planda bir zamanlayıcı ayarlıyorum. Her 10 saniyede bir çalıştırılması gereken fonksiyonda bir kırılma noktası belirledim, bu hiç çağrılmadı, fakat eğer uygulamayı durdurup sonra zamanlayıcıya devam edersem, ve zamanlayıcı her 10 saniyede bir problemsizce yürütülür, garip değil mi?

Hata ayıklama işlemi olmadığında zamanlayıcının yine de yürüteceğini düşünmüştüm, ancak hata ayıklamayı duraklatmamışım gibi aynı şey değil.

Soruma NEDEN ?? Zamanlayıcı, duraklatıldıktan sonra çalıştığı için doğru şekilde (varsayım) ayarlanır, ancak değil.

Herhangi bir fikrin var mı?

self.timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(doStuff) userInfo:nil repeats:YES]; 

Ve işlevinde bir webcoder bağlanmak:

Ben sayacını ayarlamak yoludur.

Teşekkürler.

+0

Bu, zamanlayıcılarla ilgilidir, hata ayıklama değildir; Başlığını düzelt, lütfen. Ve bu soruyu etiketlemek için yapabileceğiniz en iyi şey "objektif-c" dir? – matt

+0

[NSTimers arka planda çalışan?] Olası bir kopyası (http://stackoverflow.com/questions/5901398/nstimers-running-in-background) – matt

cevap

20

Benzer bir uygulama tasarımına sahibim ve aynı şeyde takılı kaldım. Ne internette bir yerlerde bulunan bu hala şeyler bunu durdurmak için gidiş değil sahip os söyler açıklamada applicationDidEnterBackground:

UIBackgroundTaskIdentifier locationUpdater =[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [[UIApplication sharedApplication] endBackgroundTask:locationUpdater]; 
     locationUpdater=UIBackgroundTaskInvalid; 
    } ]; 

bu tip ekleyerek olduğunu.

benim zamanlayıcı ben benim konumum yöneticisi temsilci yöntemlerinde sayacını ayarlamak bu fonksiyonu

//this is a wrapper method to fit the required selector signature 
- (void)timeIntervalEnded:(NSTimer*)timer { 
    [self writeToLog:[NSString stringWithFormat:@"Timer Ended On %@",[NSDate date]]]; 
    [self startReadingLocation]; 
    [timer invalidate]; 
    timer=nil; 
} 

bağlı bulunmaktadır.

Acılarınızı hissediyorum. Bu şeylerin süper titiz olduğunu buldum. Bu benim için çalıştı. Umut ediyorum bu yardım eder. Arka planda neler yapabileceğiniz konusunda hiçbir kısıtlama bulunmadığını öğrendim.

+0

çok teşekkürler cwieland, mükemmel çalıştı. – subharb

+0

Aslında tüm sorunumu çözmedi. Artık bir kilitlenme günlüğü alıyorum, çünkü arka plan görevini bitiremiyorum çünkü uygulamanın arka planda olduğu sürece görev asla bitmemesi gerekiyor. NStimer kalıcı olarak tekrar edecektir. Mümkün mü? ya da bir konum uygulaması olduğu için eylemleri GPS'e bağlamalı mıyım? – subharb

+0

Çarpışmanın tam olarak ne olduğundan emin değilim. Arka planda bir soket bağlantısı sağlayabiliyorum, bu yüzden sadece konum tabanlı şeyler ile sınırlı olmadığına eminim. Ama söylediğim gibi, bu problemler çözülmesi en kolay olanı değil. Üzgünüm daha fazla yardım edemedim. Benim zamanlayıcı – utahwithak

0

Arka planda neler yapabileceğiniz konusunda kısıtlamalar olabilir. Arka plana girmeden önce zamanlayıcıyı çalışma döngüsüne eklemeyi deneyin. Bu bile işe yaramayabilir; arka planda çalışabilecek tek kodunuz, kaydolduğunuz Çekirdek Konum yöntemleri tarafından çağrılan koddur (ör. locationManager:didUpdate...). Ancak benim izlenimim, arka plana girmeye başlamadan önce zaten çalışan zamanlayıcıların çalışmaya devam etmesidir.

+0

Ancak bu, hata ayıklamanın neden çalıştığını açıklamıyor. Anlamadığım bu. Uygulamanın hata ayıklamasıyla aynı şekilde davrandığını veya sadece – subharb

+0

'u çalıştırdığını farz ediyorum. Eğer önerdiğim şeyi denediysem (zamanlayıcısını hala ön planda tutarken) problemi çözmüş olacağımı düşünüyorum. Bu aslında kabul ettiğiniz çözümle aynıdır. Sorununuz, daha önce arka planda olduğunuz ve zamanlayıcınızı ayarlamadan önce runloop'un çalışmayı durdurmuş olmasıydı. Bir kesme noktasında duraklatmak ve arka plandayken devam etmek, runloop'unuzu çalıştırmak için yeni bir şans verir, böylece bu noktada zamanlayıcı runloop'a eklenir. Bu tahmin çalışması ama ben bunun fenomeni açıkladığına inanıyorum. – matt

İlgili konular