Lop*_*ope 5 iphone cocoa-touch
我正在尝试创建将同时处理多个下载的类(我需要下载大量的小文件),并且我遇到了"消失"连接的问题.
我有函数addDonwload,它将url添加到要下载的url列表,并检查是否有可用的免费下载插槽.如果有,它立即开始下载.当其中一个下载完成后,我选择第一个url表单列表并开始新的下载.
我使用NSURLConnection进行下载,这里有一些代码
- (bool) TryDownload:(downloadInfo*)info
{
int index;
@synchronized(_asyncConnection)
{
index = [_asyncConnection indexOfObject:nullObject];
if(index != NSNotFound)
{
NSLog(@"downloading %@ at index %i", info.url, index);
activeInfo[index] = info;
NSURLRequest *request = [NSURLRequest requestWithURL:info.url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15];
[_asyncConnection replaceObjectAtIndex:index withObject:[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:TRUE]];
//[[_asyncConnection objectAtIndex:i] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
return true;
}
}
return false;
}
- (void)connectionDidFinishLoading:(NSURLConnection*)connection
{
[self performSelectorOnMainThread:@selector(DownloadFinished:) withObject:connection waitUntilDone:false];
}
- (void)DownloadFinished:(id)connection
{
NSInteger index = NSNotFound;
@synchronized(_asyncConnection)
{
index = [_asyncConnection indexOfObject:(NSURLConnection*)connection];
}
[(id)activeInfo[index].delegate performSelectorInBackground:@selector(backgroundDownloadSucceededWithData:) withObject:_data[index]];
[_data[index] release];
[activeInfo[index].delegate release];
@synchronized(_asyncConnection)
{
[[_asyncConnection objectAtIndex:index] release];
[_asyncConnection replaceObjectAtIndex:index withObject:nullObject];
}
@synchronized(downloadQueue)
{
[downloadQueue removeObject:activeInfo[index]];
[self NextDownload];
}
}
- (void)NextDownload
{
NSLog(@"files remaining: %i", downloadQueue.count);
if(downloadQueue.count > 0)
{
if([self TryDownload:[downloadQueue objectAtIndex:0]])
{
[downloadQueue removeObjectAtIndex:0];
}
}
}
Run Code Online (Sandbox Code Playgroud)
_asyncConnection是我的下载插槽数组(NSURLConnections)downloadQueue是要下载的网址列表
发生的事情是,一开始一切正常,但在几次下载后,我的连接开始消失.下载开始但连接:didReceiveResponse:永远不会被调用.输出控制台中有一件事我不明白我可能会有所帮助.Normaly在我的NSLog消息之前有类似2010-01-24 21:44:17.504 appName [3057:207]的内容.我想方括号中的数字是某种app:thread id?一切正常,但有一段时间后,"NSLog(@"下载%@在索引%i",info.url,索引);" 消息开始具有不同的第二个数字.当发生这种情况时,我会停止接收该urlconnection的任何回调.
这让我疯了,因为我有严格的截止日期,我找不到问题.我对iphone开发和多线程应用程序没有太多经验.我一直在尝试不同的方法,所以我的代码有点混乱,但我希望你会看到我在这里尝试做什么:)
顺便说一下,你们中任何一个人都知道我可以使用的现有类/ lib也会有所帮助.我希望并行下载能力o动态添加新文件下载(所以在开头用所有网址初始化下载器对我没用)
这段代码中存在大量严重的内存问题和线程同步问题。
我不会详细讨论所有问题,而是会问以下问题:您是在某种后台线程上执行此操作吗?为什么?IIRC NSURLConnection 已经在后台线程上进行下载,并在创建 NSURLConnection 的线程上调用您的委托(例如,理想情况下是您的主线程)。
建议您退后一步,重新阅读 NSURLConnection 文档,然后删除后台线程代码以及不必要地注入的所有复杂性。
进一步的建议:不要尝试在两个数组中保持并行定位(以及上面与此相关的一些粗略代码),而是创建一个数组并拥有一个包含 NSURLConnection 和表示结果的对象的对象。然后你可以在连接完成时释放连接实例var。当您处理完数据后,还有父对象(以及数据)。
| 归档时间: |
|
| 查看次数: |
1158 次 |
| 最近记录: |