ios - تحميل العديد من الملفات(الصور والفيديو) في الخلفية مع ترتيب الأولوية
swift background (2)
إلقاء نظرة على توردونلوادماناجر . ويستخدم NSURLSessionDownloadTask
ويدعم أيضا وسائط الخلفية.
ما عليك القيام به هو:
1. تعيين HTTPMaximumConnectionsPerHost
إلى 1 للتأكد من أن تحميل يحدث تسلسلي:
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.timeoutIntervalForRequest = 30.0;
configuration.HTTPMaximumConnectionsPerHost = 1; // Note this
2. وفيما يلي الطريقة التي تكررت ل حلقة وتحميل وسائل الإعلام واحدا تلو الآخر:
-(void)downloadDocuments
{
for(int i=0; i<[arrDownloadList count]; i++)
{
Downloads *download = [arrDownloadList objectAtIndex:i];
NSString *fileURL = download.documentURL;
[[TWRDownloadManager sharedManager] downloadFileForURL:fileURL
withName:[fileURL lastPathComponent]
inDirectoryNamed:kPATH_DOC_DIR_CACHE_DOCUMENTS
completionBlock:^(BOOL completed)
{
if (completed)
{
/* To some task like database download flag updation or whatever you wanr */
downloadIndex++;
if(downloadIndex < [arrDownloadList count]) {
[self updateDownloadingStatus];
}
else {
[self allDownloadCompletedWithStatus:TRUE];
}
}
else
{
/* Cancel the download */
[[TWRDownloadManager sharedManager] cancelDownloadForUrl:fileURL];
downloadIndex++;
if(downloadIndex < [arrDownloadList count]) {
[self updateDownloadingStatus];
}
else {
[self allDownloadCompletedWithStatus:TRUE];
}
}
} enableBackgroundMode:YES];
}
}
لا تنسى لتمكين وضع الخلفية:
enableBackgroundMode:YES
3. تمكين Background Modes
في كسكودي:
4. إضافة الطريقة التالية إلى AppDelegate
الخاص بك:
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler{
[TWRDownloadManager sharedManager].backgroundTransferCompletionHandler = completionHandler;
}
إذا قمت بذلك، سوف يحدث تحميل متسلسل وسوف تستمر حتى لو كان التطبيق في الخلفية أو المستخدم أقفال الجهاز.
يرجى إضافة تعليق في حالة وجود أي سؤال أو مساعدة بخصوص هذا.
في بداية الأولى من التطبيق أريد تحميل جميع الملفات من الخادم وأريد أن تستمر في تحميل حتى عندما يترك المستخدم التطبيق (انها ليست في المقدمة). الملفات التي تحتاج إلى تحميل هي الصور المصغرة والصور في الحجم الأصلي، وغيرها من الملفات والفيديو. أريد تحميلها من أجل كما كتبت من قبل.
أنا أستخدم ألاموفير وقمت بتعيين مدير الجلسة:
let backgroundManager: Alamofire.SessionManager = {
let bundleIdentifier = "com....."
return Alamofire.SessionManager(
configuration: URLSessionConfiguration.background(withIdentifier: bundleIdentifier + ".background")
)
}()
ثم أنا استخدامه مثل هذا:
self.backgroundManager.download(fileUrl, to: destination)
.downloadProgress { progress in
//print("Download Progress: \(progress.fractionCompleted)")
}
.response(completionHandler: result)
انها في طريقة تحميل التحميل وأنا أسميها:
for item in items {
self.downloadPhoto(item: item, isThumbnail: true, shouldReloadData: false, indexPath: nil)
self.downloadPhoto(item: item, isThumbnail: false, shouldReloadData: false, indexPath: nil)
}
ثم يمكنني إضافة دعوة لتحميل ملف وتحميل الفيديو وغيرها. ولكن كل هذه الطلبات لها نفس الأولوية وأود أن تحميل الصور المصغرة أولا (لأن هذا ما يرى المستخدم في البداية) ثم الصور بالحجم الكامل وبعد تحميل جميع الصور ثم الملفات وأشرطة الفيديو. ولكن يجب أن يكون كل في طابور لأنه إذا كان المستخدم يبدأ التطبيق ومن ثم تعيينه إلى الخلفية وتركها لعدة ساعات كل يجب أن يتم تحميلها. هل هذا ممكن؟ وكيف يمكنني القيام بذلك؟
كنت أبحث في ألاموفير أن لديها مكتبة مكون ألاموفريماج التي لديها الأولوية تحميل تحميل ولكن الصور هي مجرد جزء من الملفات التي أريد أن تعطي الأولوية. شكرا للمساعدة
وأعتقد أن دائرة الرقابة الداخلية القياسية URLSessionDownloadTask
سوف تساعدك. لديها priority
الملكية، والتي تبدو وكأنك تحتاج.
هنا الوثائق الرسمية
هنا هو بعض البرنامج التعليمي