2

也可以看看:

带有 Cookie 的 Objective-C 异步 Web 请求

我花了一天时间编写这段代码,谁能告诉我这里出了什么问题?

WSHelper 继承自 NSObject,我什至尝试过 NSDocument 和 NSObjectController 等等。

-(void) loadUrl: (NSString*) urlStr{
    url = [[NSURL alloc] initWithString:urlStr];
    request = [NSURLRequest requestWithURL:url cachePolicy: NSURLRequestReloadIgnoringCacheData timeoutInterval: 60.0];
    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
    if(connection)
    {
        receivedData = [[NSMutableData data] retain];
            //[connection start];
    }
    else
    {       display error etc...   }
    NSApplication * app = [NSApplication sharedApplication];
    [app runModalForWindow: waitWindow];// <-- this is the problem...
}

-(void)connection: (NSURLConnection*)connection didReceiveData:(NSData*)data{
    progressText = @"Receiving Data...";
    [receivedData appendData:data];
}

-(void)connection: (NSURLConnection *)connection didFailWithError:(NSError *)error{
    progressText = @"Error...";
    NSAlert * alert = [[NSAlert alloc] init];
    [alert setMessageText:[error localizedDescription]];
    [alert runModal];
}


- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    progressText = @"Done...";
    pData = [[NSData alloc] initWithData:receivedData];
    [self hideWindow];
}

代码不会做任何事情,它根本没有进展。我什至尝试使用/不使用 startImmediately:YES 但没有运气!!!,这是在主窗口中执行的,因此即使线程及其运行循环也成功运行。

我尝试调用同步请求,它工作正常!但我需要异步解决方案。

我已经在项目中添加了 CoreServices.Framework,还有什么我应该添加到项目中的吗?任何编译器设置?还是我必须先初始化任何东西才能使用 NSURLConnection?

任何在其自己的 NSRunLoop、Objective-C 和 MAC 开发上的不同线程上运行 NSURLConnection 的解决方案在文档中的任何地方都没有示例代码,这使得一切都变得如此难以编码。

4

4 回答 4

4

我也遇到了在模态窗口中使用 NSURLConnection 时没有调用委托方法的问题。

经过一番调查,下面的代码解决了它。

NSURLConnection* conn = [[NSURLConnection alloc] initWithRequest:requst delegate:self startImmediately:NO];
[conn scheduleRunLoop:[NSRunLoop currentRunLoop] forMode:NSModalPanelRunLoopMode];
[conn start];

但是,当调用 connectionDidFinishLoading 时,[NSApp stopModal] 不起作用,需要调用 [NSApp abortModal] 来代替。

于 2011-04-24T05:24:22.300 回答
3

首先,您使启动连接过于复杂。改成:

connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]

删除[connection start]. 现在:

  • 您的应用程序确定正常运行运行循环吗?NSURLConnection 需要这个才能工作。
  • 您是否能够执行 URL 请求的同步加载?
  • 在调试器中,您能看到这url是您所期望的吗?它是什么?
  • 您是否有可能在收到任何委托消息之前释放 WSHelper?NSURLConnection 毕竟是异步的。

使用 NSURLConnection 不需要做任何特别的事情,它是 Foundation 框架的一个简单部分。不需要特殊的编译器设置。使用前无需初始化。没有。请不要开始盲目尝试引入 CoreServices.Framework 之类的东西。

由于同步发送请求是可行的,因此您对异步方面的处理一定有问题。它可能是:

  • runloop 未运行,NSDefaultRunLoopMode因此连接无法自行安排。
  • 您的代码的其他一些部分-cancel在连接有机会加载之前调用它。
  • 您正在设法在连接有机会加载之前解除分配。

真正的问题

啊,事实上我刚刚意识到发生了什么。您正在调用:

-[NSApp runModalForWindow:]

阅读有关此方法作用的说明NSURLConnection它没有像预期的那样运行运行循环。我想说的是,你真的不想在运行 URL 连接时呈现一个非常像这样的窗口。

我还建议您也实现-connection:didReceiveResponse:委托方法。您想在此处检查服务器是否正在返回预期的状态代码。

于 2009-04-02T14:07:57.633 回答
3

你说你在模态对话框中使用它?模态对话框将运行循环置于不同的模式。除了正常的运行循环模式之外,您应该能够通过安排它在模式对话框运行循环模式下运行来使其工作。connection分配后尝试添加这行代码loadURL:

[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSModalPanelRunLoopMode];

希望有帮助。

于 2009-04-02T20:38:43.087 回答
1

你怎么知道它什么都没做?编译过程中是否有任何错误或警告消息?程序运行时控制台上是否显示任何错误消息?

您是否尝试过在代码中设置断点并遵循您期望发生的事情?

于 2009-04-01T16:47:21.097 回答