il ASINetworkQueue
è solo una sottoclasse di NSOperationQueue
, ciò che fa, è creare una coda di oggetti richiesta, così per esempio, è possibile avere 10 richieste in attesa, e partecipare a 5 alla volta, quando una richiesta è stata completata, una nuova richiesta in la coda diventa attiva.
Avere una coda di richieste è certamente utile nel tuo caso, ma non hanno alcun codice incollato, su come hai a che fare con le richieste al momento. Quindi ti darò un "concetto generale" su come dovrebbe essere fatto:
In primo luogo, presumo che tu abbia già capito come identificare quando l'utente sta per scaricare il brano e avere il URL del file. In caso contrario, here's another question related. Inoltre, have ASI installed.
Aggiungiamo un oggetto che gestisce i download, per esempio, DownloadManager:
#import "ASINetworkQueue.h"
#import "ASIHTTPRequest.h"
@interface DownloadManager : NSObject <ASIHTTPRequestDelegate>
{
ASINetworkQueue *requestQueue;
}
+ (DownloadManager*)sharedInstance;
- (void)addDownloadRequest:(NSString*)URLString;
farò questa classe si comporta come un Singleton (based on this answer), perché immagino che si sta lavorando con una sola coda di download . Se questo non è il caso, adattarlo alle proprie esigenze:
@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
Con tutto quello che fatto, ora è possibile aggiungere le richieste di download semplicemente facendo:
DownloadManager *manager = [DownloadManager sharedInstance];
[manager addDownloadRequest:MyUrl];
La prima scheda potrebbe aggiungere gli elementi al DownloadManager
, l'altra scheda dovrebbe sentire per quando un download è completo, o lo stato corrente. Non l'ho aggiunto al codice, in quanto dipende da come fai queste cose. Potrebbe essere un metodo delegato personalizzato (ad esempio - (void)DownloadManager:(DownloadManager*)downloadManager didFinishDownloadRequest:(ASIHTTPRequest*)request
) o passare l'attuale delegato delle richieste o utilizzando NSNotificationCenter.
belle ans ma come ci mostra il progresso in ProgressBar altra tabella in tableView allora?. Se l'utente aggiunge una richiesta alla volta e questo è in fase di download e aggiunge un'altra richiesta, allora cosa succede? – dark
u possibile scaricare i songgs in thread in background, quindi se un altro viene u bisogno di fare la coda è fino prima completato utilizzando il NSOperation anche ...... quindi u bisogno di puntate le operazioni .. –
@lak in Iphone avete qualche link tutorial di esso ?? – dark