重新定义外部块(promiseKit)

Posted

技术标签:

【中文标题】重新定义外部块(promiseKit)【英文标题】:Redefine extern block (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 文件的全局范围内重新定义。 【参考方案1】:
PMKUnhandledErrorHandler = ^(id error) 
    // your code here
;

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

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

【讨论】:

谢谢你,成功了。需要注意的一点是,这似乎需要在方法中使用。全局使用它会导致类型错误。

以上是关于重新定义外部块(promiseKit)的主要内容,如果未能解决你的问题,请参考以下文章

恢复块的无效转换,PromiseKit

然后在 Promisekit 中重新加载 tableview

isKindOfClass 在 PromiseKit 中返回 nil 吗?

PromiseKit - 带有重新加载第一个承诺的可选承诺

While Loop 在 Promisekit 完成运行并在 Swift 中返回正确的值之前递增并重新运行

如何使用 Combine + Swift 复制 PromiseKit 风格的链式异步流