FreePascal / Lazarus和实现nsurlconnectiondatadelegate

8

我想实现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"

通过以上测试,初始测试结果似乎不太理想。我们到达了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;
  • 在一个函数中,我已经将NSURLResponse?翻译为指向NSURLResponse的指针…但不确定哪个是正确的?
  • 编译器抱怨我必须在我的第一个函数上添加“override”(尽管NSObject中没有任何一个函数被实现),并给出以下信息:

错误:只能在Objective-C和Java中覆盖继承的方法,在NSURLConnectionDelegateCategory中定义了“override”(继承的方法)

  • 如果像建议的那样添加“override”,我得到:

错误::219:1:错误:无效的符号重定义

错误:"-TmsMacRequestDeletegate connection::]":

错误:^

1个回答

0

抱歉回复晚了。我不经常关注SO,但有人刚刚指向了我这篇文章。

NSURLConnectionDataDelegateProtocol的声明可在随FPC一起提供的CocoaAll单元中找到。您可以将委托声明为objcclass(NSObject,NSURLConnectionDataDelegateProtocol),以便

  1. 您无需为每个方法/消息指定消息名称(编译器将从协议/接口中获取它们)
  2. 编译器可以指出任何缺少方法/冲突消息名称的错误

主要问题是您的消息名称不完整。例如,对于您的第一个“connection”方法,它必须是'connection:didReceiveResponse:'。这就是运行时找不到它们的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接