Swift 3(Xcode 8.3.2)のswitch文を使用して、swissySSONを使用してMacOSアプリケーションを解析しています。それぞれのケースについて、同じクラス(NSViewController)で宣言されているテキストビューへの更新を印刷しようとしていて、関連するストーリーボードに@IBOutletを使用してバインドしています。DispatchQueueを使用してswitchステートメントからNSTextViewを更新する際の遅延を修正する
私はtextViewを更新し、その関数(func addLogToConsoleWindow(newLogEntry: String) {}
)をtextViewに印刷する関連テキストで呼び出すための関数を宣言しました。
関連するコードは、次のとおり
@IBOutlet var textViewActivityLog: NSTextView! // Create an outlet for the activity log view
.............
for jsonObj in arrayOfJSONObjects {
if jsonObj != JSON.null {
// Use a switch statement to select the correct Class to use for storing the appropriate event
switch jsonObj["event"].string! {
case "Docked":
arrayOfDockedEvents.append(jsonObj)
self.addLogToConsoleWindow(newLogEntry: "Docked event being parsed")
case "FSDJump":
arrayOfFSDJumpEvents.append(jsonObj)
self.addLogToConsoleWindow(newLogEntry: "FSD Jump event being parsed")
case "Progress":
arrayOfProgressEvents.append(jsonObj)
self.addLogToConsoleWindow(newLogEntry: "Commander's progress being parsed")
case "Rank":
arrayOfRankEvents.append(jsonObj)
self.addLogToConsoleWindow(newLogEntry: "Rank information being parsed")
case "LoadGame":
arrayOfLoadGameEvents.append(jsonObj)
self.addLogToConsoleWindow(newLogEntry: "Game load details being parsed")
case "StartJump":
arrayOfStartFSDJumps.append(jsonObj)
self.addLogToConsoleWindow(newLogEntry: "Start FSD Jump event being parsed")
case "MiningRefined":
arrayOfMiningRefined.append(jsonObj)
self.addLogToConsoleWindow(newLogEntry: "Mining event being parsed")
default:
if !setOfEventType.contains(jsonObj["event"].string!) {
self.addLogToConsoleWindow(newLogEntry: "\((jsonObj["event"].string!)) event discovered but not parsed")
}
}
} else {
print("Haven't been able to find a jsonObj")
}
} // END OF 'for jsonObj'
...........
@objc func addLogToConsoleWindow(newLogEntry: String) {
textViewActivityLog.string? = "\n" + newLogEntry + (textViewActivityLog.string)!
textViewActivityLog.scrollRangeToVisible(NSMakeRange(0, 0))
} // END OF addLogToConsoleWindow()
私が探している動作は、特定のケースにアクセスした直後にtextView(textViewActivityLog.string?)を更新することです。
ただし、textViewはすぐには更新されません。 for jsonObj in arrayOfJSONObjects {}
のループが完了した後でのみ更新されます。これは、forループが実行されるのと同時に、数千のテキスト行が同時に表示されることを意味します。
func addLogToConsoleWindow(newLogEntry: String) {}
関数が呼び出されたコードのポイントで、textViewを更新するにはどうすればよいですか?
喜んで受け取ったアドバイスやガイダンス。関連する以前の質問を見つけることができませんでした。
バックグラウンドスレッドでJSONを解析し、メインスレッドのテキストビューを更新します。 – Willeke
ありがとう - それは私を超えています。だからいくつかの研究と私は報告します。 – Wolfstar
質問がなぜ書き下されたのか分かりません。なぜ私は学ぶことができるか、誰かに助言することができますか? – Wolfstar