- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
有一个带有以下声明的协议(protocol):
typealias SuggestionSourceCallback = ([Suggestion]) -> ()
protocol SuggestionSource {
func suggest(_ query: SuggestionQuery, callback: @escaping SuggestionSourceCallback)
}
有两个类实现了这个协议(protocol)。第一类异步获取建议(通过 GCD )
final class FisrtClass: SuggestionSource {
private let queue = DispatchQueue(label: "my.app.queue", attributes: [])
private var lastQuery: SuggestionQuery?
// ...
func suggest(_ query: SuggestionQuery, callback: @escaping SuggestionSourceCallback) {
self.queue.async { [weak self] in
// capturing strong self
guard let strongSelf = self else {
return
}
// referencing self here, for example
guard self.lastQuery == query else {
return
}
// suggestions is a local variable
var suggestions: [Suggestion] = []
// ...
DispatchQueue.main.async {
callback(suggestions)
}
}
}
}
...而第二类同步进行
final class SecondClass: SuggestionSource {
// ...
func suggest(_ query: SuggestionQuery, callback: @escaping SuggestionSourceCallback) {
// ...
callback(self.suggestions[query])
}
}
我的问题是:
FirstClass
的实现中捕获 strongSelf
吗?SecondsClass
的实现中捕获 strongSelf
吗?附加问题。假设 SecondClass
有它的 suggestions
作为一个 static let
,在这种情况下会是什么模式?
final class SecondClass: SuggestionSource {
static let suggestions: [String: [SuggestionQuery]] = {
// ...
}()
// ...
func suggest(_ query: SuggestionQuery, callback: @escaping SuggestionSourceCallback) {
// ...
callback(self.suggestions[query])
}
}
最佳答案
在SecondClass
中,不需要创建strongSelf
变量。你会把它放在哪里?关键是 self
无论如何都保证不会是 nil
,因为您正在其方法之一的范围内运行。
您的附加问题也是如此,但出于不同的原因。 suggestions
现在是 static
,所以用 self
作为前缀是一个语法问题,(我假设你也想为 suggest 添加前缀
方法与 static
)。
但是,在 FirstClass
中,捕获 strongSelf
和不捕获它之间存在细微差别。
因为您使用的是[weak self]
,所以当您进入该 block 时,self
可能是nil
,所以无论如何您都需要检查一下.一种方法是重复使用可选链接,即:
self?.doSomething()
self?.doSomethingElse()
这是在说:
If I have a reference to self, do something. If I still have a reference to self, do something else.
通过添加一个 strongSelf
变量:
guard let strongSelf = self else {
return
}
strongSelf.doSomething()
strongSelf.doSomethingElse()
...你是说:
do something and do something else if you have a reference to
self
, otherwise do nothing.
因此,您保证如果第一件事发生,第二件事也会发生。您采用的方法将取决于您的应用。
关于 swift 3 : capture strong self in @escaping closure without asynchronous work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40844049/
嵌套内联标签和 anchor 标签时,最佳做法是什么? link或 link 令人惊讶的是,我没有在这里找到答案,也没有用谷歌搜索。 最佳答案 没有一个是正确的。 如果这只是整个 的样式问题标记为粗
我有一个问题,表格内的 strong 标签没有加粗。我有以下 html 代码: 这里我有一个 fiddle :http://jsfiddle.net/JxQCr/
我试图从看起来像这样的HTML输出中获取数据: Target1NoSpaces .... Target2 With Spaces .... 我正在使用管道火车将数据缩减到我要达到的目标。到目前为止,这
请问您能找到解决这个简单问题的方法吗? text1: text2 我正在尝试抓取这个 html 部分,所以我需要分别获取 text1 和 text2。怎么做? 它应该是这样的: x = tree.xp
我正在开发一个 HTML5/javascript/php 项目,我有一个设置为可编辑的项目。 我知道用户可以按 ctrl + b使文本加粗,但我也希望允许用户能够单击网页上的相应按钮来执行相同的操作。
我刚得到一大块别人写的代码。起初我认为它是错别字,但后来在其他几个地方也注意到了它。 要点是另一个程序员(不确定他的“技能水平”)将一些属性声明为 @property (strong, strong)
我在一个网站上有几篇文章;所有这些帖子都是这种类型的聊天对话: AD:嘿! BC:怎么了? 广告:没什么 BC:好的 它们被标记为被 标记包围的简单段落。 使用 javascript 替换功能,我希
我有一个 PHP 文本字符串: MOST of you may have a habit of wearing socks while sleeping. Wear socks while sl
强签名 和强命名 .NET 程序集之间有区别吗? 如果是,我如何确定一个程序集是否使用 Visual Studio 进行了强签名(我知道如何检查它是否被强命名)? 谢谢你的帮助 编辑 背景:WiX:
我使用 xpath 删除 $nodeList = $xpath->query("//p[text()=\"\xC2\xA0\"]"); # foreach(
如何替换用 标记标记到特定的 div? 例如: hellowow! 使用javascript替换为 hellowow! 请帮忙!提前致谢。 ***** 为什么我要尝试更改输出 HTML 代码 至
我在葡萄 api 应用程序中使用 active-record 4.0,但由于强参数仅适用于 rails Controller ,我如何允许葡萄 api 类中的参数 最佳答案 似乎有办法在 Contro
在 JavaScript 中,我使用此正则表达式从文本字符串中删除所有 HTML 标记: t.replace(/]+>/g, ''); 现在我需要同样的东西,但它应该保留以下标签(它们不应该被替换):
好吧,强弱舞的道理我明白了。 一个例子是,假设 B 强引用一个 block ,我们在 B 中设置该 block 以强引用自身 (B)。我们现在有 B 强引用我们的 block ,也许我们的 block
YUI 中的这一行 Reset CSS给我带来了麻烦: address,caption,cite,code,dfn,em,strong,th,var { font-style: normal;
我遇到了“强最终一致性”的概念。 它应该比“最终一致性”强但比“强一致性”弱吗?有人可以用适用的例子解释这三个概念之间的区别吗? http://en.wikipedia.org/wiki/Eventu
这个问题在这里已经有了答案: selenium.common.exceptions.InvalidSelectorException with "span:contains('string')" (
所以我有以下要解析的示例 html。 Title: Sub Editor at NEWS ABC Name: John Where: Everywhe
在我的应用程序中,我有不同的页面:联系我们、关于我们、主页 它们都具有需要填充 View 的相同基本元素: 页面标题 元描述 用户信息 但是在每个页面上,它们都有一些不同的元素: 联系我们 联系信息模
我有这样一个字符串: Foo 我想用PHP来制作 Foo …不影响其他span。 我该怎么做? 最佳答案 $text='Foo'; $text=preg_replace( '/(.*?)/', '$1
我是一名优秀的程序员,十分优秀!