Tom*_*Tom 8 pascal freepascal lazarus nsurlconnectiondelegate
我正在尝试实现 nsurlconnectiondatadelegate,因为我需要支持异步模式 - 在同步模式下,我不想要自动遵循重定向。
作为参考,我有使用 urlRequest 等在同步模式下工作的代码。
问题是我无法让 FPC/Lazarus 编译我的代码。
...
代码片段
{$mode objfpc}
{$modeswitch objectivec1}
{$modeswitch objectivec2}
Run Code Online (Sandbox Code Playgroud)
...
// We need to implement support for NSURLConnectionDelegate and NSURLConnectionDataDelegate
TmsMacRequestDelegate = objcclass(NSObject)
public
// this will set flag when done
procedure connectionDidFinishLoading(ANSUC: NSURLConnection); message onnectionDidFinishLoading:'; override;
// ... implement rest?
end;
Run Code Online (Sandbox Code Playgroud)
...
requestDelegate := TmsMacRequestDelegate.alloc.init;
urlConnection := NSURLConnection.connectionWithRequest_delegate(urlRequest, requestDelegate);
// ... setup flag
urlConnection.start;
// ... wait here in loop checking flag set by "finish loading"
Run Code Online (Sandbox Code Playgroud)
...
有了上述内容,初步测试似乎不太顺利。我们到达 urlConnection.start; 但 connectionDidFinishLoading 永远不会被调用。我的理论是,可能是因为我们没有完全实现委托。但是,这样做给我带来了其他问题 - 这是声明:
TmsMacRequestDelegate = objcclass(NSObject)
public
procedure connectionDidFinishLoading(ANSUC: NSURLConnection); message 'connectionDidFinishLoading:'; override;
procedure connection(ANSUC: NSURLConnection; didReceive: NSURLResponse); message 'connection::';
procedure connection(ANSUC: NSURLConnection; didReceive: NSData); message 'connection::';
procedure connection(ANSUC: NSURLConnection; didSendBodyData: Integer; totalBytesWritten: Integer; totalBytesExpectedToWrite: Integer); message 'connection::::';
procedure connection(ANSUC: NSURLConnection; willSend: NSURLRequest; redirectResponse: PNSURLResponse); message 'connection:::';
procedure connection(ANSUC: NSURLConnection; willCacheResponse: NSCachedURLResponse); message 'connection::';
end;
Run Code Online (Sandbox Code Playgroud)
错误:继承的方法只能在Objective-C和Java中被覆盖,添加“覆盖”(NSURLConnectionDelegateCategory中定义的继承方法
错误: :219:1: 错误: 无效的符号重新定义
错误:“-TmsMacRequestDeletegate 连接::]”:
错误:^
小智 0
这么晚才回复很抱歉。我并不积极关注 SO,但有人只是向我指出了这篇文章。
NSURLConnectionDataDelegateProtocol 的声明在 FPC 附带的 CocoaAll 单元中可用。您可以将委托声明为 objcclass(NSObject, NSURLConnectionDataDelegateProtocol) 所以
主要问题是您的消息名称不完整。例如,对于您的第一个“连接”方法,它必须是“connection:didReceiveResponse:”。这就是运行时找不到它们的原因。