SORU
25 NİSAN 2012, ÇARŞAMBA


objective c - beginBackgroundTaskWithExpirationhandler Doğru kullanımı

Biraz beginBackgroundTaskWithExpirationHandler kullanma hakkında kafam karıştı.

Elma applicationDidEnterBackground temsilci kullanma örnekleri, daha fazla zaman almak için bazı önemli görev, ağ işlem genellikle tamamlamak için gösterir.

Benim app bakıldığında, ağ eşyalarımı en önemli gibi görünüyor, ve bir başlatıldığında eğer kullanıcı giriş düğmesine basıldığında, onu tamamlamak istiyorum.

Bu yüzden mi kabul/iyi uygulama kaydır her ağ işlem (ve ben bahsetmiyorum indirme büyük bir yığın veri, çoğunlukla bazı kısa xml) beginBackgroundTaskWithExpirationHandler olmak güvenli yan?

CEVAP
25 NİSAN 2012, ÇARŞAMBA


Eğer ağ işlem arka planda devam etmek istiyorsanız, o zaman bir arka plan görevi sarın gerekir. İşiniz bittiğinde endBackgroundTask dediğin o da çok önemli - aksi takdirde uygulamayı tahsis süresi dolduktan sonra öldürülecek.

Böyle bir şey benim eğilimindedir:

- (void) doUpdate 
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        [self beginBackgroundUpdateTask];

        NSURLResponse * response = nil;
        NSError  * error = nil;
        NSData * responseData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error];

        // Do something with the result

        [self endBackgroundUpdateTask];
    });
}
- (void) beginBackgroundUpdateTask
{
    self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask];
    }];
}

- (void) endBackgroundUpdateTask
{
    [[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask];
    self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}

Her bir arka plan görevi için UIBackgroundTaskIdentifier bir özelliği var


Swift kodu eşdeğer

func doUpdate () {

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {

        let taskID = beginBackgroundUpdateTask()

        var response: NSURLResponse?, error: NSError?, request: NSURLRequest?

        let data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error)

        // Do something with the result

        endBackgroundUpdateTask(taskID)

        })
}

func beginBackgroundUpdateTask() -> UIBackgroundTaskIdentifier {
    return UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({})
}

func endBackgroundUpdateTask(taskID: UIBackgroundTaskIdentifier) {
    UIApplication.sharedApplication().endBackgroundTask(taskID)
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FattySpins's channel

    FattySpins's

    17 Mayıs 2009
  • Jonathan Flavell

    Jonathan Fla

    1 HAZİRAN 2006
  • natescamp

    natescamp

    30 NİSAN 2009