Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.

Background Thread'i Sonlandırma

+1 oy
199 kez görüntülendi
21, Ağustos, 2015 ios development kategorisinde burhanaksendir tarafından soruldu
21, Ağustos, 2015 burhanaksendir tarafından düzenlendi
Uygulama içerisindeki bir viewcontroller'da video oynatıyorum. Bu oynatma işlemi öncesinde de videoyu çağırmak için şu şekilde bir arkaplan görevi oluşturuyorum ki main thread kitlenmesin:

let priority = DISPATCH_QUEUE_PRIORITY_BACKGROUND        dispatch_async(dispatch_get_global_queue(priority, 0))  {

//burada video kontrol ediliyor, bazen zaman alabiliyor buradaki işlemler...
//işlemler bitince burada video oynatmayı tetikleyen fonksiyon çağrılıyor ve video oynatılıyor...

 }

Daha sonra, kullanıcı videonun açılmasını beklemeden sıkılıp bu video izleme ekranından çıkınca (benim uygulamamda bir geri tuşu var. Basit bir button. Dokunulunca diğer bir ViewController'e gidiyor.),  işte tam bu esnada arkaplan görevi  de sonlansın istiyorum. Bunu nasıl yapacağım ?

Çünkü bunu yapmadığım için, kullanıcı video izleme ekranında olmadığı halde arkaplan görevi  sonlanmadığı için birdenbire hiç olmadık bir viewcontroller'da video oynatılmaya başlıyor. Tam bir kabus gibi :)

1 cevap

+1 oy
24, Ağustos, 2015 yasin tarafından cevaplandı
24, Ağustos, 2015 burhanaksendir tarafından seçilmiş
 
En İyi Cevap

GCD operasyonları iptal edilemezler.
videoyu çağırmak için nasıl bir işlem yapıyorsunuz da main thread etkileniyor onu anlayamadım. Normalde etkilenmemesi lazım.

24, Ağustos, 2015 burhanaksendir tarafından yorumlandı
Bunu öğrenmem iyi oldu. İptal edilememesi çok kötüymüş.
Videoyu çağırıken sunucu testi yapıyorum. 3 sunucu var. Hangisi meşgul değil ise o sunucudan geliyor oynatılacak link.

Normalde kitlenme olmuyor. Ama Network Link Conditioner'in "Very Bad Network" isimli preseti ile debug ederken main thread kitleniyor, bu işlemleri yaptığı için. O yüzden de "DISPATCH_QUEUE_PRIORITY_BACKGROUND " içine aldım işlemi.

GCD yerine, iptal edilebilme özelliği olan başka şansım var mı?
24, Ağustos, 2015 yasin tarafından yorumlandı
reachability kullanarak spesifik bir adresin response durumunu test edebilirsiniz  mesela.
24, Ağustos, 2015 burhanaksendir tarafından yorumlandı
Teşekkür ederim. Reachability'i nasıl kullanacağımı bilmiyorum ama şöyle bir fonksiyon yazdım:


class func remoteFileExistsAsync(completionHandler : ((isResponse : Bool) -> Void), url: String) {
        
        let url: NSURL = NSURL(string: url)!
        let request: NSMutableURLRequest = NSMutableURLRequest(URL: url)
        request.HTTPMethod = "HEAD"
        request.timeoutInterval = 7.0
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: { response, data, error in
            
            if error != nil  {
                
                completionHandler(isResponse : false)
            }else{
                
                if let httpResponse = response as? NSHTTPURLResponse {
                    
                    if httpResponse.statusCode == 200 {
                        
                        completionHandler(isResponse : true)
                    }else{
                        
                       completionHandler(isResponse : false)
                    }
                }
            }
            
        })
    }

İş görüyor gibi ama tam istediğim şekilde olmadı. Yine  hafif de olsa bir tıkanma oluyor.
24, Ağustos, 2015 yasin tarafından yorumlandı
sendAsynchronousRequest'ile adrese bir istek göndermenizi ben de önerecektim, ama request timeoutInterval nedeniyle cevap vermeyen sunucular için beklemek gerekeceğinden bunu tavsiye etmeyi uygun görmedim açıkçası.
Sizin için uygunsa tabiki kullanılabilir.
24, Ağustos, 2015 burhanaksendir tarafından yorumlandı
Sağolun. Dediğiniz gibi iş görüyor şimdilik. eksik olmayın. timeoutInterval'e mecburen az değer girdim çünkü bazen çok uzun süre bekliyor  network durumuna bağlı olarak. Ben de en azından diğer sunucuya geçiyorum.
...