我正在尝试实现nsurlconnectiondatadelegate,因为我需要支持异步模式 - 在同步模式下,重定向会自动遵循我不想要的。
作为参考,我让代码在与 urlRequest 等同步模式下工作。
问题是我无法让FPC/Lazarus编译我的代码。
。
代码片段
{$mode objfpc}
{$modeswitch objectivec1}
{$modeswitch objectivec2}
。
// 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;
。
requestDelegate := TmsMacRequestDelegate.alloc.init;
urlConnection := NSURLConnection.connectionWithRequest_delegate(urlRequest, requestDelegate);
// ... setup flag
urlConnection.start;
// ... wait here in loop checking flag set by "finish loading"
。
综上所述,初步测试似乎并不顺利。我们到达网址连接.开始;但连接确实完成加载永远不会被调用。我的理论是,这可能是因为我们没有完全实现委托。但是,这样做会给我带来其他问题 - 这是声明:
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;
- 在一个函数中,我将NSURLResponse?翻译为指向的指针 NSURLResponse...但不确定这里什么是正确的?
- 编译器抱怨我必须在我的第一个函数上添加"override"(尽管没有一个函数在 NSObject 中实现?(并显示以下消息:
错误:继承的方法只能在 Objective-C 和 Java,添加"override"(继承的方法定义在 NSURLConnectionDelegateCategory
- 如果我像建议的那样添加"覆盖",我会得到:
:219:1:错误:符号重定义无效
错误:"-TmsMacRequestDeletegate connection::]":
错误:^
抱歉回复晚了。我不积极关注SO,但有人刚刚指出我这篇文章。
NSURLConnectionDataDelegateProtocol 的声明在 FPC 附带的 CocoaAll 单元中可用。您可以将委托声明为 objcclass(NSObject, NSURLConnectionDataDelegateProtocol(
- 您不需要为每个方法/消息指定消息名称(编译器将从协议/接口中获取它们(
- 编译器可以指出缺少方法/冲突消息名称方面的任何错误
主要问题是您的消息名称不完整。 例如,对于您的第一个"连接"方法,它必须是"connection:didReceiveResponse:"。这就是运行时找不到它们的原因。