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

  • Pituvision

    Pituvision

    11 Mart 2006
  • Sams Page :D

    Sams Page :D

    15 Mart 2009
  • sknbp

    sknbp

    16 Kasım 2006