c++ - 自己线程中的 NSURLConnection 在没有自旋循环的情况下无法工作

标签 c++ objective-c upload nsurlconnection

我遇到了一个 Objective-C uploader 类的问题,该类不会上传(失败/成功委托(delegate)未被调用并且服务器显示没有传入请求),除非我有一个自旋循环。它与自旋循环完美配合。

我是 objective-C 的新手,设置如下: 主应用实例化一个 C++ 类 (cppClass),该类在单独的 pThread 中运行静态函数 (cppFuncA)。

静态函数 (cppFuncA) 实例化一个 Objective-C 类/对象 (UploadFunc),它获取一些数据并将其上传。

CppClass {
    static void cppFuncA (...);
} 

cppFuncA(...) {
    UploadFunc* uploader = [[[UploadFunc alloc] retain] init];
    while (condition) {
        ...
        [uploader uploadData:(NSData*)data];
    }
    [uploader release]
}

uploader .h

@interface UploadFunc : NSObject
{
    bool conditional;
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
- (void) uploadData:(NSData*)data;
@end

uploader .mm

@implementation UploadFeedback
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    conditional = false;
    [connection release];
    NSLog(@"Connection failed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    conditional = false;
    NSLog(@"Succeeded! Received %d bytes of data",0);
    [connection release];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"Response=%@", response);
}

-(void) uploadData:(NSData*)data
{
    …
    NSMutableURLRequest *theRequest=[NSMutableURLRequest requestWithURL:theURL];
    … construct request …

    NSURLConnection* theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

    // Only works if I have this following spin loop
    conditional = true;
    while(conditional) {     
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }
    if (!theConnection) std::cerr << "Connection to feedback failed\n";
}

最后一个函数“-(void) uploadData:(NSData*)data”是我遇到问题的地方。如果没有自旋循环,它将无法工作。对正在发生的事情有什么想法吗?

我在 NSURLRequest 和 NSURLConnection 中添加了 retain,所以我不认为这是请求未被复制的竞争条件。

编辑:我觉得这些可能是类似的问题: NSURLConnection - how to wait for completionAsynchronous request to the server from background thread 然而,即使函数完成并超出范围,我的对象 (UploadFunc) 仍然存在...

最佳答案

不要在默认模式下运行你的运行循环。该框架可以将其他运行循环源置于默认模式,当您只想处理您的 NSURLConnection 时它们将触发。不可否认,框架在后台线程的运行循环上安排其他源应该不常见,但您不能确定。

运行 run loop 不应该是忙循环。除非数据传入速度快于您可以处理的速度,否则您不应激增 CPU 使用率。它似乎是忙循环的事实让我怀疑在默认模式下安排了另一个运行循环源。

在私有(private)运行循环模式下安排 NSURLConnection(只是您的应用程序独有的任意字符串),然后在该模式下运行运行循环。您可以使用 -initWithRequest:delegate:startImmediately: 初始化 NSURLConnection,为最后一个参数传递 NO 以避免在默认模式下进行调度。然后使用 -scheduleInRunLoop:forMode: 将其安排在您的私有(private)模式下。

关于c++ - 自己线程中的 NSURLConnection 在没有自旋循环的情况下无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10081985/

相关文章:

C++,为什么基类需要一个VTable

c++ - 使用 C++11 线程确保每个线程都有机会在给定时间段内执行

java - 在 Java 和 C++ 中增加计数器的最佳方法?

iphone - 应用程序不改变方向

php - 清除临时上传文件夹的最佳方法

python-3.x - CherryPy上传文件

C++ 可变数量的嵌套循环

iphone - heightForRowAtIndexPath崩溃

objective-c - FFMPEG - 跳过某些关键帧的解码会导致延迟?

jquery - BlueImp jQuery 文件上传和 "&lt;input type="文件>"