【问题标题】:making use of libcurl progress data利用 libcurl 进度数据
【发布时间】:2013-04-19 12:52:37
【问题描述】:

在 Xcode 中设置了一组 curl_easy_setopt 函数,用于将文件上传到服务器/API,并且(经过大量试验和错误)它的运行就像一个魅力。在经历了其他几个问答之后,我还设法设置了一个简单的 CURLOPT_PROGRESSFUNCTION,如下所示:

static int my_progress_func(void *p,
                        double t,
                        double d,
                        double ultotal,
                        double ulnow)
{
printf("(%g %%)\n", ulnow*100.0/ultotal);
// globalProgressNumber = ulnow*100.0/ultotal;
return 0;
}

随着上传的进行,“0%.. 16%.. 58%.. 100%”会输出到控制台;灿烂。 我无法做的是实际使用这些数据(globalProgressNumber),例如。对于我的 NSProgressIndicator; CURL 有点劫持我的应用程序,并且在进度完成之前不允许任何其他输入/输出。

我尝试从 my_progress_func 更新 IBOutlets(例如 [_myLabel setStringValue:globalProgressNumber];),但静态 int 函数不允许这样做。 [self] 也不允许,因此无法发布到 NSNotificationCenter: [[NSNotificationCenter defaultCenter] postNotificationName:@"Progressing" object:self];

我的 curl 函数从我的主类/窗口 (NSPanel) 运行。

关于如何在我的 .xib 上实现实时/更新元素有什么好的建议吗?

【问题讨论】:

    标签: c++ xcode cocoa libcurl


    【解决方案1】:

    在进度完成之前,CURL [...] 不允许任何其他输入/输出。

    你是从主线程调用curl_easy_perform 吗?如果是,则不应这样做,因为此函数是同步的,即它会阻塞直到传输完成。

    换句话说,长时间运行的任务(例如使用网络 I/O)必须在单独的线程上运行,而 UI 代码(例如更新标签的文本)必须在主线程上运行。

    如何实现实时/更新元素

    您绝对应该注意在单独的线程中执行 curl 传输。

    这可以通过使用自定义协议将其包装到 NSOperation 中来轻松实现,以通知委托进度(例如您的视图控制器):

    • 将您的操作推送到NSOperationQueue
    • 操作队列将负责分离传输并将其运行到另一个线程中,
    • 在操作方面,还是应该使用进度功能,通过CURLOPT_PROGRESSDATA curl 选项将操作对象设置为不透明对象。通过这样做,每次调用进度函数时,您都可以通过转换 void *clientp 不透明指针来检索操作对象。然后通知代理在主线程中(例如performSelectorOnMainThread)的当前进度,以确保您可以执行 UI 更新,例如刷新您的 NSProgressIndicator

    作为NSOperation 的替代方案,您还可以使用Grand Central Dispatch (GCD) 和块。如果可能的话,我强烈建议您使用BBHTTP,它是适用于 iOS 5+ 和 OSX 10.7+ 的 libcurl 客户端(BBHTTP 使用 GCD 和块)。

    仅供参考:这里有一个example from BBHTTP,它说明了如何使用上传进度块轻松执行文件上传 - 这适用于 iOS,但应该可直接用于 OS X。

    【讨论】:

    • 谢谢; NSOperationQueue 真的成功了!有了这个实现,我需要做的就是调用 performSelectorOnMainThread 函数来访问我的进度数据。结果:ppsht.com - BBHTTP 绝对是任何未来项目的最佳选择!
    猜你喜欢
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 2012-07-20
    • 2017-01-14
    • 1970-01-01
    • 2021-07-01
    相关资源
    最近更新 更多