使用范围外范围内的数据
Posted
技术标签:
【中文标题】使用范围外范围内的数据【英文标题】:Use data from a scope outside of the scope 【发布时间】:2016-03-22 10:13:07 【问题描述】:我正在尝试在 iPhone 应用程序中使用来自网站的文本。为此,我使用网络 scraper ,Osmosis。我设法检索了我想要的数据,但我不能将数据影响到一个数组,以便在函数之外使用它。这是我所做的一个 sn-p:
class ViewController: UIViewController
@IBOutlet weak var quote: UILabel!
private var array: [[String: AnyObject]] = []
var initArray: [[String: AnyObject]]
get
return array
set
for e in self.initArray
array.append(e)
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
getQuotes()
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
func getQuotes()
Osmosis(errorHandler: (error) -> Void in
print(error)
)
.get(NSURL(string: "http://www.example.com")!)
.find(OsmosisSelector(selector: ".parentDiv"), type: .CSS)
.populate([
OsmosisPopulateKey.Single("quotes") : OsmosisSelector(selector: ".childDiv")
], type: .CSS)
.list (dict) -> Void in
self.array.append(dict)
print(self.initArray) // this prints data
.start()
print(self.initArray) // This prints an empty array
我认为我不能使用该数组,因为它填充在 Osmosis()
的 init 中,但我想知道如何在我的代码中的其他地方使用它。你能解释一下我的代码中发生了什么(为什么我只能使用.list()
中的数据)以及如何解决这个问题。
编辑: 我尝试使用 getter 和 setter 来检索范围之外的数据,但结果与没有 getter/setter 相同。
【问题讨论】:
我知道我的标题根本不明确,但我不知道如何更准确。如果您找到更好的标题,请继续更改它。干杯 您遇到的一个问题是您的array
属于[[String: AnyObject]]
类型,而您的quotesArray
属于同一类型,但您尝试将array
附加到quotesArray
:它可以不行。如果你想将一个字典数组附加到一个新的容器数组中,这个容器的类型应该是[[[String: AnyObject]]]
,但我不确定这真的是你想要做的......
另一个问题是 print(self.array)
在 Osmosis 闭包的范围之外,所以你正在查看它,而它还没有被填充 所以你认为它是空的。将print(self.array)
放在.list
块内,就在右大括号之前的空行中。
感谢您的回答@EricD。我知道在范围内打印我的数组会起作用,但我的目标是使用范围外的数据。
我试图将quotesArray的类型更改为[[[String: AnyObject]]]
,但是当我打印它时它会打印一个空数组...
【参考方案1】:
您想将一个数组的所有元素添加到另一个数组吗?
for e in quotesArray
self.array.append(e)
或
self.array.appendContentsOf(quotesArray)
【讨论】:
我确实想将array
的元素添加到quotesArray
。我尝试了您的两种解决方案,但它打印了一个空数组...
你确定你的 api 不是异步的吗?您是否在追加后立即添加打印?
我的猜测是 api 是异步的,我在范围之外打印,因为我希望我的数据在任何地方都可用。
您必须在计算完成后放置所有取决于计算结果的逻辑。打印必须在 .list 内吗
通过在计算完成后放置逻辑,您的意思是我必须在渗透范围之外填充我的数组?如果这就是你的意思,我尝试这样做,但它返回一个空数组。【参考方案2】:
根据 Christian Dietrich 的回答和 cmets,我设法通过更新我范围内的 UI 来解决我的问题。
这是我所做的:
import UIKit
import Osmosis
class ViewController: UIViewController
@IBOutlet weak var quote: UILabel!
var array: [[String: AnyObject]] = []
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
getQuotes()
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
func getQuotes()
var updateText: String = ""
Osmosis(errorHandler: (error) -> Void in
print(error)
)
.get(NSURL(string: "http://www.exemple.com")!)
.find(OsmosisSelector(selector: ".wrapper"), type: .CSS)
.populate([
OsmosisPopulateKey.Single("div") : OsmosisSelector(selector: ".div")
], type: .CSS)
.list (dict) -> Void in
self.array.append(dict)
updateText = self.array[0]["div"] as! String
self.quote.text = updateText
self.view.setNeedsDisplay()
.start()
感谢您的帮助!
【讨论】:
以上是关于使用范围外范围内的数据的主要内容,如果未能解决你的问题,请参考以下文章