【问题标题】:Redefine extern block (promiseKit)重新定义外部块(promiseKit)
【发布时间】:2015-04-15 16:01:27
【问题描述】:

我正在使用 PromiseKit(很棒的框架,顺便说一句!)来处理我的应用程序和服务器 API 之间的通信。我想创建某种全局处理程序来响应诸如通知用户我的许多承诺中缺乏网络连接之类的事情。

PMKPromise.h 文件列出了一个未处理的错误处理程序:

/**
Called by PromiseKit in the event of unhandled errors.
The default handler NSLogs the error. Note, your handler is executed
from an undefined queue, unless you manage thread-safe data, dispatch to
a safe queue before doing anything else in your handler.
*/
extern void (^PMKUnhandledErrorHandler)(NSError *);

然后在 PMKPromise.m 文件中实现此类型,尽管 doc 块暗示这可以被覆盖。我的问题是我该如何重新定义这个变量?

复制 .m 文件中使用的相同语法会给我一个链接器错误

void(^PMKUnhandledErrorHandler)(id) = ^(NSError *error){
    //...
};

==> duplicate symbol _PMKUnhandledErrorHandler

【问题讨论】:

  • 您是要重新定义块类型还是创建该类型的块?另外,您的第二个代码块在什么范围内?顶层?在函数或方法内部?
  • 试图重新定义类型。试图在我的一个 .m 文件的全局范围内重新定义。

标签: ios objective-c promisekit


【解决方案1】:
PMKUnhandledErrorHandler = ^(id error) {
    // your code here
};

请注意不方便的错误处理程序,有时它会在错误发生后的很长一段时间内被调用,具体取决于相关承诺何时被解除分配。它是可靠的,但并不总是立即可靠。

99% 的情况下它会很慢,因为某些对象在您的链中的某个地方仍然有一个 Promise 句柄,并且它很快就会被释放但尚未释放。

【讨论】:

  • 谢谢你,成功了。需要注意的一点是,这似乎需要在方法中使用。全局使用它会导致类型错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 2018-02-15
  • 1970-01-01
相关资源
最近更新 更多