проблема с загрузкой нескольких песен в приложении TabBar - PullRequest
8 голосов
/ 30 августа 2011

У меня есть приложение на панели вкладок, на первой вкладке у меня есть веб-представление, поэтому, когда пользователь открывает веб-сайт и собирается загрузить какой-либо формат песни в формате mp3, он выдвигает другой вид, который получает название от пользователя.

после присвоения заголовка я просто изменяю tabbarSelectController на один заголовок для песни, и загрузка начинается и отображается на панели вкладок в выбранном индексе 1. Когда я меняю вкладку на выбранный индекс 0 и выбираю другую песню для загрузкиснова вернемся к selectedIndex 1, первая загрузка остановилась и 2-я загрузка возобновилась.

, поэтому я хочу загрузить несколько песен и не очень понимаю, как это сделать в этом сценарии, потому что пользователь добавляет песни динамически. Я также видел ASINtworkQueue, но не понимаю, как это работает

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

Я предложу это по-другому ..

Попробуйте поместить код для загрузки песни в другой класс.ОС Iphone автоматически начнет новое соединение для каждого объекта этого класса.Теперь обе загрузки могут продолжаться одновременно.

Работает прекрасно.Я видел это.

1 голос
/ 30 августа 2011

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 .

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...