Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.
0 oy
1.2k kez görüntülendi
ios development kategorisinde tarafından
NSURLSessionDownloadTask ile uzun sürecek bir download işlemi yapılırken, uygulama kullanıcı tarafından veya sistem tarafından terminate edildiyse yani tamamen kapatıldıysa, bu indirme işleminin akıbeti ne oluyor ?
İndirmeye devam ediliyor mu ?
İndirme görevini tamamlayabilme yeteneğine sahip mi ?

Tam olarak yapmak istediğim uzun sürecek download işlemleri için hangi yolu izlemem gerektiğini öğrenmek ve bunun için bir algoritma oluşturmak. Bu konuda tecrübelerinizi paylaşırsanız ve mümkünse örneklendirebilirseniz çok sevinirim.

1 cevap

+1 oy
tarafından
tarafından seçilmiş
 
En İyi Cevap

bu iş için her zaman olduğu gibi afnetworking'i önereceğim.
öncelikle uygulama terminate edildiğinde background'aki download işleminiz durdurulur. Bunun aşmanın bir yolu yok. Bunu bir kenara koyalım.
Uygulama background'ayken indirme işlemine devam edebiliriz. Fakat yukarıdaki gibi bir durum hasıl olurda uygulama kullanıcı tarafından kapatılır veya bir nedenle terminate edilirse ne yapacağız.
o zaman indridiğimiz kaynak partial download header'larını gönderiyorsa, afnetworking'e ek olarak yazılmış AFDownloadRequestOperation yardımıyla partial download'ları kontrol edebliriz. uygulamamız yeniden açıldığında indirmesi tamamlanmamış dosyalarımızı kaldığı yerden indirmeye devam edebiliriz.

çok basit bir örnek hazırladım şuradan inceleyebilirsiniz.
https://drive.google.com/file/d/0B_33To7xgYO7Wk1MdHgtSll5dTg/view?usp=sharing

tarafından
tarafından düzenlendi
Çok teşekkür ederim. Her zamanki gibi çok anlaşılır bir örnek oldu benim için. Eksik olmayın.

Birkaç detay hakkında bilgi alabilir miyim ?

var progressBar:UIProgressView! = nil
şeklinde değişkeni tanımlamanızla, aşağıdaki gibi tanımlanması arasında önemli bir fark var mı ?
var progressBar: UIProgressView?

indirme yeri olarak tmp kullanmak mı gerekiyor, direkt Documents'in altında bir klasör oluşturmak istersem bunu nasıl yapabilirim ?

do not backup kullanmam gerekince, indirilecek klasöre mi ("downloadTempFolder") yoksa  indirilen dosyaya mı do not backup attribute eklemem gerekiyor ?

İndirme esnasında bir hata oluşursa, tekrar otomatik deneme işlemini nasıl başlatıyoruz acaba ? Ya da kendisi mi hallediyor ?

İndirme başlamadan önce sunucu cevap verene kadar geçen süre içerisindeki waiting state'e nasıl  erişebilirim ? Örneğin ekrana indirme başlayana kadar, "Kontrol ediliyor..." yazmak istiyorum. Bunu tam olarak nerede yapmalıyım ?

Anlamak adına soruyorum, bu Background Modes kısmından Background fetch'i işaretlemek gerekiyor mu, bahsettiğiniz devam edebilme yeteneği için ? Ya da konumuzla alakası yok mu ?

Son olarak aynı anda birden fazla download işlemi için bir sınırlama var mı ? Mesela kullanıcı listede yer alan 30- 40 linki işaretleyip indir dediğinde  bu kod yapısına göre ilerleyebilir miyim ? Yani demek istediğim kendi içinde bir quee mantığı var mı, yoksa benim mi bir sıraya koymam gerekiyor bu indirme işlemini ?

Ve en nihayetinde reject almamak için bu download işlemlerinde özellikle dikkat etmem gereken bir şeyler varsa paylaşabilir misiniz ?

Teşekkür ederim.
tarafından
+1
var progressBar:UIProgressView! = nil  ile  var progressBar: UIProgressView?
kullanmak arasında bir fark yok bendeki el alışkanlığı.

indirme işlemi bitene kadar indirilen dosyayı NSTemporaryDirectory() altında tutmalısınız, daha sonra user document directory içerisine taşımalısınız. iCloud do not back up key'inide user documents directory içerisinde set etmelisiniz.

setCompletionBlockWithSuccess block'u içerisinde failure bölümünde indirme işlemi sırasında oluşan hataları yakalayabilir ve isteğinize göre indirme işlemini yeniden başlatabilir veya kullanıcıya indirme işlemini yeniden başlatması için bir seçenek sunabilirsiniz.

url String'i NSURL içerisine aldığımız yerden itibaren kontrol ediliyor mesajı ve bir activity indicator set edebilirsiniz mesela, işleyişi durumuna göre bu mesajları güncelleyebilirsiniz mesela.

background fetch's işaretleminize gerek yok, bu örnek'te ihtiyaç duyduğumuz bir şey değil. setShouldExecuteAsBackgroundTaskWithExpirationHandler arka plan indirmeleri için gereken her şeyi bizim adımıza set ediyor zaten.

aynı anda bir den fazla download işlemi için bir üst sınır var mı tam bilemiyorum açıkçası, ama zaten AFDownloadRequestOperation aynı anda başlatılan download işlemlerini kendisi bir sıraya koyuyor.

reject mevzusu olacak bir durum gelmiyor açıkçası aklıma.
tarafından
Çok teşekkür ederim.
tarafından
TableView içinde birden çok dosyanın indirilme senaryosunu hazırlamaya çalışıyorum. Ancak tam olarak bir tıkanıklık oluştu. Acaba bu sizin örnekteki olayı, oluşturduğum uitableviewcell içinde mi gerçekleştirmem gerekiyor ? Yoksa tableview içinde mi ?
tarafından
Download için limit mümkün mü ? Verdiğiniz örneği baz alarak mesela aynı anda en fazla 4 download işlemi olmasını istersem bunu nasıl ayarlayabilirim acaba ? AFDownloadRequestOperation'da böyle bir ayar var mı, ben göremedim ?
tarafından
+1
ondan ben de tam emin olamadım. sanki bir limit set edebiliyorduk diye hatırlıyordum o nedenle AFDownloadRequestOperation dökümantasyonunu bir daha kontrol ettim, ama yok öyle bir limit set edebilme imkanı.
Benim aklımda kalan AfNetworking içerisinde kullanılan AFHTTPRequestOperationManager'in da maxConcurrentOperationCount limiti o da AFDownloadRequestOperation'da kullanılamıyor.
tarafından
Teşekkür ederim yardımlarınız için. maxConcurrentOperationCount limiti tam aradığım gibi bir şeymiş gerçekten. Bakalım biraz araştıracağım, adapte edebilir miyim bu AFDownloadRequestOperation'a, diye..
tarafından
Sizin verdiğiniz örnek üzerinden giderek, Download işlemini cancel ile iptal eden bir buton ekledim. ancak nedense incomplete içinde oluşturulan temp dosyası silinmiyor. Cancel olunca onun da otomatik silinmesi için ne yapabilirim ?
tarafından
+1
indirmeyi cancel ettiğinizde temp'e indirilen dosya kendiliğinden silinmez.
Cancel işlemini müteakiben ilgili dosyayı bulup silecek bir kod yazmalısınız.
verdiğim örnek içerisinde delete işlemini dosya indirilmesi tamamlandıktan sonra çalıştırmaya yarayan bir kod var.
viewDidLoad metodu içerisinde //delete sample comment'iyle başlayan kodu temp klasöründeki dosyanızı silecek şekilde modifiye edebilirsiniz mesela.
tarafından
Teşekkür ederim. Class içerisinde dikkatimi çeken "deleteTempFileWithError" var. Bu aynı işi yapar diye sevindim ama yemedi tabii :D
...