C++ NSURLConnection在其自身线程中没有自旋循环时不工作
我对objective-C uploader类有一个问题,除非我有一个旋转循环,否则该类将不会上载(未调用fail/success委托,服务器显示没有传入请求)。它与旋转环完美配合 我是objective-C新手,设置如下: 主应用程序实例化一个C++类(CPPPYPE),它在一个单独的PcLoad中运行静态函数(CPPPORMA)。p> 静态函数(cppFuncA)实例化一个objective-C类/对象(UploadFunc),它获取一些数据并将其上载C++ NSURLConnection在其自身线程中没有自旋循环时不工作,c++,objective-c,upload,nsurlconnection,C++,Objective C,Upload,Nsurlconnection,我对objective-C uploader类有一个问题,除非我有一个旋转循环,否则该类将不会上载(未调用fail/success委托,服务器显示没有传入请求)。它与旋转环完美配合 我是objective-C新手,设置如下: 主应用程序实例化一个C++类(CPPPYPE),它在一个单独的PcLoad中运行静态函数(CPPPORMA)。p> 静态函数(cppFuncA)实例化一个objective-C类/对象(UploadFunc),它获取一些数据并将其上载 CppClass { stat
CppClass {
static void cppFuncA (...);
}
cppFuncA(...) {
UploadFunc* uploader = [[[UploadFunc alloc] retain] init];
while (condition) {
...
[uploader uploadData:(NSData*)data];
}
[uploader release]
}
上传器
上传器
@实现上传反馈
-(无效)连接:(NSURLConnection*)连接失败错误:(NSError*)错误
{
条件=假;
[连接释放];
NSLog(@“连接失败!错误-%@%”),
[错误本地化描述],
[[error userInfo]objectForKey:nsurErrorFailingUrlStringErrorKey]);
}
-(无效)连接IDFinishLoading:(NSURLConnection*)连接
{
条件=假;
NSLog(@“成功!接收到%d字节的数据”,0);
[连接释放];
}
-(void)连接:(NSURLConnection*)连接DidReceiverResponse:(NSURResponse*)响应
{
NSLog(@“Response=%@”,Response);
}
-(void)上传数据:(NSData*)数据
{
…
NSMutableURLRequest*theRequest=[NSMutableUrlRequestWithURL:theURL];
…构造请求…
NSURLConnection*连接=[[NSURLConnection alloc]initWithRequest:theRequest委托:self];
//只有当我有下面的自旋环时才有效
条件=真;
while(有条件){
[[NSRunLoop currentRunLoop]运行模式:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
如果(!连接)std::cerr不要在默认模式下运行运行循环。框架可以将其他运行循环源置于默认模式,当您打算只处理NSURLConnection
时,它们将触发。诚然,框架在后台线程的运行循环上调度其他源应该是不常见的,但您不能我不敢肯定
运行运行循环不应该是忙循环。除非数据以超出您处理速度的速度传入,否则不应该提高CPU使用率。它似乎在忙循环这一事实让我怀疑在默认模式下安排了另一个运行循环源
在私有运行循环模式下安排NSURLConnection
(仅适用于应用程序的任意字符串)然后在该模式下运行运行循环。您可以使用-initWithRequest:delegate:startImmediately:
,为最后一个参数传递NO
,以避免在默认模式下进行调度。然后使用-ScheduleInUnloop:forMode:
在您的私有模式下对其进行调度。这是正常的。NSURLRConnection需要一个正在运行的nsrunlop才能运行。没有任何东西损坏。我明白了,谢谢。是否还有其他方法可以更有效地执行此操作?在这个运行循环中,我的CPU使用率非常高。。。
@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
@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";
}