在tabBar应用程序中下载多首歌曲的问题

时间:2011-08-30 14:30:02

标签: iphone ios4 uitabbarcontroller

我有tabbar应用程序,在第一个标签中我有一个webView,所以当用户打开网站并下载一些歌曲mp3格式时,它会推送另一个View取用用户的标题。

在给出标题之后我只需将tabbarSelectController更改为一首歌曲标题 并且下载开始并显示在所选索引1的标签栏上。当我将标签更改为所选索引0并选择另一首歌曲进行下载并再次返回selectedIndex 1时首先下载停止和第二次下载恢复。

所以我想要下载多首歌曲并且不知道如何在这种情况下如何做到这一点因为用户动态添加歌曲我也看过ASINtworkQueue但是不知道它是如何工作的

2 个答案:

答案 0 :(得分:1)

ASINetworkQueue只是NSOperationQueue的一个子类,它的作用是创建一个Request对象的队列,例如,你可以等待10个请求,一次出席5个,请求完成后,队列中的另一个请求将变为活动状态。

拥有一个请求队列对你的情况肯定是有帮助的,但你还没有粘贴任何代码,关于你现在如何处理请求。所以我会给你一个关于应该如何做的“一般概念”:

首先,我假设你已经弄清楚如何确定用户何时下载歌曲,并拥有该文件的URL。如果没有,here's another question related。另外,have ASI installed

让我们添加一个处理下载的对象,比如说DownloadManager:

#import "ASINetworkQueue.h"
#import "ASIHTTPRequest.h"

@interface DownloadManager : NSObject <ASIHTTPRequestDelegate>
{
    ASINetworkQueue *requestQueue;
}

+ (DownloadManager*)sharedInstance;
- (void)addDownloadRequest:(NSString*)URLString;

我会让这个类的行为像一个单例(based on this answer),因为我想你正在使用一个下载队列。如果不是这样,请根据您的需要进行调整:

@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

答案 1 :(得分:1)

我会以不同的方式提出建议..

尝试将歌曲下载的代码放在不同的课程中。 Iphone O.S.将自动为该类的每个对象启动一个新连接。现在两个下载都可以同时继续。

它很美妙。我已经看过了。