0
私の新しいアプリケーションに問題があります。 WebServiceから大きなxmlを取得して解析する必要があります。XmlToDictionaryを使用するとすべてが簡単になります。 私のアプリケーションをビルドしようとすると、私はタスクマネージャを見ると、私のすべてのRAMを消費するタスク( "SourceKit")です。 インターネットで検索私は問題を理解したと思う:私の解析の結果はNSDictionaryの大きな配列 "明示的ではない"タイプです。Xcode、NsDictionaryの大きな配列はすべて私のRAMを消費します
私の質問です:NSDictionaryのこの配列を管理する別の方法をご存知ですか?または、この配列を明示的に宣言するためのメソッドですか?または別の方法ですか? これは私のコードです:
//The block of the HTTP connection for get the xml form the WebService.
operation.setCompletionBlockWithSuccess({ (operation, response) -> Void in
parser = response as? XMLParser
let XmlPars = XmlParsing()
XmlPars.parsing(parser: parser!)
}, failure: { (operation, error) -> Void in
print(error.localizedDescription)
})
operation.start()
func parsing (parser : XmlParser){
let xmlStruttureTipi = (dictionary["StruttureTipi"] as! NSDictionary)
let struttureTipi = (xmlStruttureTipi[xmlStruttureTipi.allKeys[0]] as! Array<NSDictionary>)
parseStruttureTipi(struttureTipi: struttureTipi)
}
func parseStrutture {
func parseStrutture(strutture : [NSDictionary]) {
let formatter = DateFormatter()
var ArrayStrutture = [Struttura]()
for struttura in strutture{
let s = Struttura()
formatter.dateFormat = "dd-MM-yyyy"
let data = formatter.date(from: struttura["DataAggiornamento"] as! String)!
if(struttura["DataAggiornamento"] != nil){s.DataAggiornamento = data}else{s.DataAggiornamento = formatter.date(from: "00-00-0000")}
if(struttura["Longitudine"] != nil){s.Longitudine = Double((struttura["Longitudine"] as? String)!)}else{s.Longitudine = 0.0}
if(struttura["Latitudine"] != nil){s.Latitudine = Double((struttura["Latitudine"] as? String)!)}else{s.Latitudine = 0.0}
if(struttura["Nome"] != nil)
{s.Nome = struttura["Nome"] as? String}
else{s.Nome = ""}
//A lot other proprety...
ArrayStrutture.append(s)
}
let repoStrutture = RepoStruture()
repoStrutture.insertStrutture(strutture: ArrayStrutture)
}
}
予想よりも多くのメモリを使用している場合は、自動解放プールを参照してください。一度にすべてを解析しない別のXMLパーサを使用してください。 – gnasher729
問題はパーサではなく辞書の作成であることがわかりました...しかしそれはとても奇妙です – Leonardo