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/

相关文章:

iOS 在加载时设置和获取属性

ios - 将数据传递给另一个 View Controller 不起作用

objective-c - 在 PLUICameraViewController 上设置 UIButtonLabel 上的文本

http - PUT 使用流和进度上传文件的字节范围

c++ - 如何最好地测试 Mutex 实现?

c++ - 静态变量无法解析

c++ - QTreeView 的可见项目列表

c++ - 从 C++ 中的 QML-矩形请求键盘焦点

eclipse - jcop 小程序上传错误

javascript - 使用 javascript 将请求批量上传到 Google Cloud Storage