iPhone 上的并发后台下载

2024-03-01

我正在尝试创建可以同时处理多个下载的类(我需要下载很多小文件),并且我遇到了“消失”连接的问题。

我有函数 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];
        }
    }
}

_asyncConnection 是我的下载槽数组 (NSURLConnections) downloadQueue 是要下载的 url 列表

发生的情况是,一开始一切正常,但下载几次后我的连接开始消失。下载开始,但 connection:didReceiveResponse: 永远不会被调用。输出控制台中有一件我不明白的事情可能会有所帮助。通常有类似的东西 2010-01-24 21:44:17.504 应用程序名称[3057:207] 在我的 NSLog 消息之前。我猜方括号中的数字是某种 app:thread id?当数字相同时,一切正常,但一段时间后,“NSLog(@“在索引 %i 处下载 %@”,info.url,索引);”消息开始具有不同的第二个数字。当这种情况发生时,我将停止接收该 urlconnection 的任何回调。

这让我抓狂,因为我有严格的期限,而且我找不到问题。我对 iPhone 开发和多线程应用程序没有太多经验。我一直在尝试不同的方法,所以我的代码有点混乱,但我希望你能看到我在这里尝试做的事情:)

顺便说一句,你们中的任何人都知道我可以使用的现有类/库,这也会有帮助。我想要并行下载并能够动态添加要下载的新文件(因此在开始时使用所有网址初始化下载器对我来说没有帮助)


这段代码中存在大量严重的内存问题和线程同步问题。

我不会详细讨论所有问题,而是会问以下问题:您是在某种后台线程上执行此操作吗?为什么? IIRC NSURLConnection 已经在后台线程上进行下载,并在创建 NSURLConnection 的线程上调用您的委托(例如,理想情况下是您的主线程)。

建议您退后一步,重新阅读 NSURLConnection 文档,然后删除后台线程代码以及不必要地注入的所有复杂性。

进一步的建议:不要尝试在两个数组中保持并行定位(以及上面与此相关的一些粗略代码),而是创建一个数组并拥有一个包含 NSURLConnection 和表示结果的对象的对象。然后你可以在连接完成时释放连接实例var。当您处理完数据后,还有父对象(以及数据)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iPhone 上的并发后台下载 的相关文章

  • 禁用 iPhone 4S / 新 iPad 键盘上的听写按钮

    我们的应用程序是一个医疗保健应用程序 我们的应用程序中有一个符合 HIPAA 标准的语音识别器 所有听写都可以通过它进行 医院不希望医生意外开始与不符合 HIPAA 标准的 Nuance Dragon 服务器进行对话 因此 我正在寻找可以抑
  • 如何设置仅适用于 iPhone 或 iPad 的视口?

    我有一个网站 需要在 iphone 上使用 0 3 的视口值 但在 ipad 上使用 0 7 有没有办法只为 iPhone 或 iPad 设置视口 这是一种解决方案
  • iPhone 应用程序中的文本在 ipad 中的 2x 模式下出现别名

    我有一个适用于 iPhone 的应用程序 使用高分辨率图像使其适用于 iPhone 和 iPad 但在 iPad 中 所有文本在 2x 模式下都会出现别名 是否可以让App在2x模式下自动改变字体大小 或者我必须手动检测设备类型并处理字体大
  • iOS 4.3 上的cameraOverlayView 问题

    我使用带有cameraOverlayView的选择器控制器在相机视图中显示产品的图像 在应用到覆盖层之前 产品图像会调整大小 它在 iOS 4 2 上运行良好 但在 iOS 4 3 上产品图像显示为全尺寸 pickerController
  • presentRenderbuffer :GL_RENDERBUFFER_OES 需要很长时间

    我在游戏中添加了一个分析器并隔离了此功能 有时 它会导致 FPS 下降 这是我的结果 Present buffer time 22 Present buffer time 1 Present buffer time 9 Present bu
  • 如何在 SQLite 中替换字符串?

    如何更新具有以下内容的表列 var mobile 233KKFSDK3234 Documents Page jpg 并将其替换为 Documents Page jpg 在 SQLite 中 注意 所有文字 除了 Documents 是动态的
  • CMSampleBufferSetDataBufferFromAudioBufferList 返回错误 12731

    我正在尝试捕获应用程序声音并将其传递给 AVAssetWriter 作为输入 我正在设置音频单元的回调以获取 AudioBufferList 问题始于将 AudioBufferList 转换为 CMSampleBufferRef 它总是返回
  • 将语音添加到自定义 UIMenuController

    我创建了一个自定义UIMenuController in a UIWebView但它似乎摆脱了 说出选择 选项UIMenuController在那之后 所有测试设备上的 偏好设置 中都打开了发言选择选项 并且它出现在其他应用程序中 包括非
  • 如何将unix时间戳转换为iphone中的nsdate [重复]

    这个问题在这里已经有答案了 可能的重复 从 Unix 时间戳创建 NSDate https stackoverflow com questions 5827240 create nsdate from unix timestamp 我有一个
  • iOS 使用 NSColor 与 UIColor?

    有什么区别UIColor and NSColor 什么时候会使用每一种 我碰到NSColor在试图弄清楚的同时UIColor用于 iOS 中的属性字符串 我理解使用UIColor对于 UIKit 等 但我不认为NSColor对于这种事情确实
  • 在回调函数中调用目标c函数

    如何在回调函数中调用目标c函数 回调函数 static OSStatus inputRenderCallback void inRefCon AudioUnitRenderActionFlags ioActionFlags const Au
  • 如何使用 SwiftUI 获取多个屏幕上的键盘高度并移动按钮

    以下代码获取键盘显示时的键盘高度 并将按钮移动键盘高度 在转换源 ContentView 和转换目标 SecibdContentView 处以相同的方式执行此移动 但按钮在转换目标处不移动 如何使按钮在多个屏幕上移动相同 import Sw
  • UISlider不会自动重绘

    我的应用程序上有一个 UISlider 有时我不仅需要更新它的值 还需要更新它的minimumValue 值已更改 但如果我调用 setValue 方法或为滑块分配新值 它会具有新值 但滑块不会将自身重新绘制到该新值应有的位置 我怎样才能重
  • 用于具有转换的非导航应用程序的视图控制器/NIB 架构?

    我正在修补一个 iPad 应用程序 就像许多 iPad 应用程序一样 它不使用 UINavigation 根视图控制系统 因此我没有每个应用程序 视图 的自然所有权 我基本上有两个基本视图 文档列表视图和文档编辑视图 我正在使用 UIVie
  • 访问 google reader 的 Endpoints API 时出错

    我正在尝试在iPhone APP中实现google reader 到目前为止我已经成功收到了sid and auth 当我尝试使用以下命令调用 Endpoints API 时 问题就出现了GET 这是代码 ASIHTTPRequest re
  • 命令 /Applications/Xcode-beta.app/Contents/Developer/usr/bin/atool 失败,退出代码 255

    它发生在新的 Xcode7 beta 中 CompileAssetCatalog Users admin Library Developer Xcode DerivedData InstaAd ddgdnbxlpxipirebpndfmgr
  • iPhone Twitter SDK 与 iOS 5 设备的集成问题

    我已成功将 Twitter Sharekit 与我的 iPad 应用程序源集成 当我在模拟器和装有 iOS 4 X 的 iPad 1 上测试该应用程序时 它运行完美 并且成功发布了推文 但是 如果我在装有 iOS 5 的 iPad 2 上安
  • 游戏中心邀请处理程序,它属于哪里?

    我已经搜索了该网站并发现了这个 GameCenter 邀请处理程序 https stackoverflow com questions 4639284 gamecenter invitation handler He says 正如文档中所
  • 从 IOS 应用程序注销的完美方法是什么?

    下面的代码可以工作 但有一个错误 场景是 我首先登录进入应用程序系统 登录成功后 应用程序将设置 UserDefaults UserId 之后 我可以使用存储的 UserId 导航应用程序视图 一旦我进入设置和选项卡注销 这将清除 User
  • 在 Xcode5 中使用 XCTest 时 AFNetworking 导致错误

    我正在使用 Xcode 5 现在刚刚开始对现有项目进行单元测试 为此我添加了CocoaTouch Unit Testing Bundle作为我的项目的目标 目标名称是 MyAppTests 我之前使用添加了 AFNetworking 库Co

随机推荐

  • 打开磁力链接而不失去焦点

    javascript 或其他 有没有办法在浏览器失去焦点的情况下处理磁力链接 这有点像在后台打开一个选项卡而不离开当前页面 我最近遇到了类似的问题 并且能够通过在页面上创建命名框架并将其用作目标来解决该问题window open windo
  • 正则表达式:一次性获取没有扩展名的文件名?

    我只想使用正则表达式获取文件名 所以我一直在尝试简单的事情 例如 当然 只有当文件名具有一个扩展名时才有效 但如果是的话adfadsfads blah txt我只是想adfadsfads blah 我怎样才能用正则表达式做到这一点 关于大卫
  • 检查 C 中的溢出

    让我们有 int a b c may be char or float anything actually c a b 让int类型用4个字节表示 假设 a b 需要比 4 个字节多 1 位 即 假设结果是 1 00 0 32 个零 二进制
  • Surface SDK 可以在 Visual Studio 2012 上运行吗?

    我需要使用 Surface SDK 创建一个 WPF 应用程序 我正在使用 Visual Studio 2012 并且根据this https stackoverflow com questions 11624895 how can i u
  • AndroidNotification.Builder与NotificationCompat.Builder[重复]

    这个问题在这里已经有答案了 我看到的几乎所有 Android 通知示例代码似乎都使用了NotificationCompat 我已经使用Notification Builder编写了自己的代码 我不清楚使用NotificationCompat
  • 我应该如何多次插入多条记录?

    我有一个名为Entry声明如下 class Entry string Id get set string Name get set 然后是一个接受多个这样的方法Entry使用 ADO NET 插入数据库的对象 static void Ins
  • 两次之间经过的小时数,与国家/地区和时区无关

    我们如何确定两次之间经过的小时数 例如 旧金山下午 3 30 迪拜下午 7 30 我不清楚的部分是 是否存在通过考虑时区和国家来计算减去的时间跨度的通用方法 我使用 C 作为主要语言 任何帮助将不胜感激 提前致谢 您询问的是 旧金山下午 3
  • 如何在Python中使用wrap_strategy来处理谷歌表格?

    我有一个 python 代码 它使用驱动器和工作表 api 来列出文件夹内的文件 我在这个文件夹中有多个谷歌工作表 其中一些在文本之间有空格 就像图片中给出的那样 我想使用 googlesheet api 将所有单元格的文本换行更改为溢出
  • iOS - 具有自动布局的比例间距

    我正在尝试使用界面生成器创建一个完美的比例视图 到目前为止 一切都很好 我正在以编程方式缩放字体 按钮等 唯一的问题是元素之间的约束 间距 保持不变 我想避免为间距限制创建出口 因为它看起来很混乱 我希望元素之间的间距在拉伸元素时保持成比例
  • 使用用户名通过 https 配置 WCF 以获得 WS-Security

    我正在尝试使用 WCF 客户端通过 https 调用基于 Java 启用 WS Security 的 Web 服务 但似乎无法获得正确的安全配置 使用 SvcTraceViewer 我在尝试过的任何安全配置中都没有看到预期的安全标头 我最近
  • Android Studio“运行应用程序”对话框不会出现在一个项目中,但会出现在另一个项目中

    我正在用 Android Studio 制作一个非常简单非常愚蠢的应用程序来了解如何保存关键首选项 但我遇到了一个奇怪的障碍 我会尽力提供尽可能多的信息 因为可能很难重现这个错误 但老实说 我正在运行的两个应用程序都是超级基础在那里没有编译
  • 如果选中单选按钮,则更改父 div (li) 背景 - javascript

    我在 li 元素内有单选按钮 我想在选中单选按钮后更改 li 父 div 的背景颜色 我成功地通过 CSS 在 li 上设置了悬停 但 checked 似乎不适用于父 div 这是我的 html css 代码 job manager ter
  • 如何使用 jquery mobile 在网络应用程序上添加全屏欢迎图像

    我认为 jQTouch 中有它 但是如何为使用 jQueryMobile 开发的 iPhone Web 应用程序添加全屏欢迎图像 该应用程序是一个全屏网络应用程序 它已经添加到 iPhone 主屏幕中 这只是一个概念 但你可以尝试这样的事情
  • 在 NodeJS 中将一个大型 csv 文件(200'000 行以上)插入到 MongoDB 中

    我正在尝试解析一个大的 csv 文件并将其插入到 MongoDB 中 但是当该文件扩展 100 000 行时 我从服务器得到了错误的响应 而我需要插入的文件通常都在 200 000 行以上 我尝试过批量插入 insertMany 和Baby
  • 在默认浏览器中打开 TWebBrowser 链接

    我的应用程序显示一个从网络加载的小横幅TWebBrowser控制 该横幅实际上是一个包含图像的 HTML 页面 当用户单击图像时 他们将进入我们当前正在进行的促销活动 这里的坏处是 当单击 TWebBrowser 中的链接时 活动页面会在
  • a-frame vr如何拖放资产/元素洞察图片?

    我正在尝试框架 但找不到任何有关如何拖放元素的信息 并且已经寻找了几个小时 有人熟悉a frame吗 谢谢 到目前为止 这就是我的代码
  • WatchKit NSUserDefaults 和 NSKeyedUnarchiver 问题

    在我的项目中 我有一个名为 Country 的自定义对象 它实现了 NSCoding 该代码通过引用在 iPhone 和 Watch 应用程序之间共享 两个应用程序都位于同一应用程序组中 在我的 iPhone 应用程序中 我使用 NSUse
  • Scrapy:在一个请求失败时(例如404,500),如何请求另一个替代请求?

    我有一个关于 scrapy 的问题 在一个请求失败时 例如404 500 如何请求另一个替代请求 例如两个链接都可以获取价格信息 其中一个失败 则自动请求另一个 在请求中使用 errback 例如 errback self error ha
  • 为什么以及何时应该使用稀疏列? (SQL 服务器 2008)

    在浏览了一些有关 SQL Server 2008 新功能 SPARSE COLUMN 的教程后 我发现如果列值为 0 或 NULL 则不会占用任何空间 但当有值时 则需要常规空间的 4 倍 非稀疏 列保存 如果我的理解是正确的 那么为什么我
  • iPhone 上的并发后台下载

    我正在尝试创建可以同时处理多个下载的类 我需要下载很多小文件 并且我遇到了 消失 连接的问题 我有函数 addDonwload 将 url 添加到要下载的 url 列表中 并检查是否有可用的免费下载槽 如果有 它会立即开始下载 当其中一个下