ASINetworkQueue
- это просто подкласс NSOperationQueue
, он создает очередь объектов запросов, например, вы можете иметь 10 ожидающих запросов и посещать 5 одновременно, когда запрос завершено, другой запрос в очереди становится активным.
Наличие очереди запросов, безусловно, полезно в вашем случае, но вы не вставили никакого кода в то, как вы сейчас работаете с запросами. Поэтому я дам вам «общую концепцию» того, как это должно быть сделано:
Во-первых, я предполагаю, что вы уже выяснили, как определить, когда пользователь собирается загрузить песню, и получить URL-адрес файла. Если нет, то вот еще один вопрос, связанный . Кроме того, имеет установленную ASI .
Давайте добавим объект, который обрабатывает загрузки, скажем, DownloadManager:
#import "ASINetworkQueue.h"
#import "ASIHTTPRequest.h"
@interface DownloadManager : NSObject <ASIHTTPRequestDelegate>
{
ASINetworkQueue *requestQueue;
}
+ (DownloadManager*)sharedInstance;
- (void)addDownloadRequest:(NSString*)URLString;
Я заставлю этот класс вести себя как одиночка ( на основе этого ответа ), потому что я представляю, что вы работаете с одной очередью загрузки. Если это не так, адаптируйте его под свои нужды:
@implementation DownloadManager
static DownloadManager *_shared_instance_download_manager = nil;
+ (DownloadManager*)sharedInstance
{
@synchronize
{
if (!_shared_instance_download_manager)
{
_shared_instance_download_manager = [[DownloadManager alloc] init];
}
return _shared_instance_download_manager
}
}
- (id)init
{
self = [super init];
if (self)
{
requestQueue = [[ASINetworkQueue alloc] init];
requestQueue.maxConcurrentOperationCount = 2;
requestQueue.shouldCancelAllRequestsOnFailure = NO;
}
return self;
}
- (void)addDownloadRequest:(NSString*)URLString
{
NSURL *url = [NSURL URLWithString:URLString];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
request.delegate = self;
[requestQueue addOperation:request];
[requestQueue go];
}
- (void)requestFinished:(ASIHTTPRequest*)request
{
// Request finished.
}
- (void)dealloc
{
[requestQueue release];
[super dealloc];
}
@end
После всего этого вы можете добавить запросы на скачивание, просто выполнив:
DownloadManager *manager = [DownloadManager sharedInstance];
[manager addDownloadRequest:MyUrl];
На первой вкладке будут добавлены элементы в DownloadManager
, на другой вкладке будет необходимо узнать, когда загрузка будет завершена, или текущий статус. Я не добавил это в код, так как это зависит от того, как вы это делаете. Это может быть пользовательский метод делегата (например, - (void)DownloadManager:(DownloadManager*)downloadManager didFinishDownloadRequest:(ASIHTTPRequest*)request
), или передача текущего делегата запросов, или использование NSNotificationCenter .
.