Skip to content

Commit

Permalink
add parse data offline with combine
Browse files Browse the repository at this point in the history
  • Loading branch information
xqsadness committed Sep 21, 2023
1 parent ddc8793 commit 784f17b
Show file tree
Hide file tree
Showing 5 changed files with 357 additions and 191 deletions.
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,118 @@
uuid = "40680EE2-D096-4625-B9E1-B90CF7A46FFB"
type = "0"
version = "2.0">
<Breakpoints>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "6D186499-383D-4553-9F43-0F0D52EFD085"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "DefaultProject/DEFAULT_SOURCE/CONTROLL_APP/CONSTANT.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "63"
endingLineNumber = "63"
landmarkName = "loadData(_:)"
landmarkType = "7">
<Locations>
<Location
uuid = "6D186499-383D-4553-9F43-0F0D52EFD085 - 70ba66d3b96d59c"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "closure #1 (__C.FIRDataSnapshot) -&gt; () in DefaultProject.CONSTANT.loadData(() -&gt; ()) -&gt; ()"
moduleName = "DefaultProject"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/darktech4/QuizKid/DefaultProject/DEFAULT_SOURCE/CONTROLL_APP/CONSTANT.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "63"
endingLineNumber = "63"
offsetFromSymbolStart = "560">
</Location>
<Location
uuid = "6D186499-383D-4553-9F43-0F0D52EFD085 - bc563ae47193a895"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "closure #1 () -&gt; () in closure #1 (__C.FIRDataSnapshot) -&gt; () in DefaultProject.CONSTANT.loadData(() -&gt; ()) -&gt; ()"
moduleName = "DefaultProject"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/darktech4/QuizKid/DefaultProject/DEFAULT_SOURCE/CONTROLL_APP/CONSTANT.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "64"
endingLineNumber = "64"
offsetFromSymbolStart = "48">
</Location>
</Locations>
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "6FD388C0-50AA-4843-A795-6C62C17947D2"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "DefaultProject/DEFAULT_SOURCE/CONTROLL_APP/CONSTANT.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "70"
endingLineNumber = "70"
landmarkName = "loadData(_:)"
landmarkType = "7">
<Locations>
<Location
uuid = "6FD388C0-50AA-4843-A795-6C62C17947D2 - 37b0f4f70749a51c"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "DefaultProject.CONSTANT.loadData(() -&gt; ()) -&gt; ()"
moduleName = "DefaultProject"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/darktech4/QuizKid/DefaultProject/DEFAULT_SOURCE/CONTROLL_APP/CONSTANT.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "70"
endingLineNumber = "70"
offsetFromSymbolStart = "1548">
</Location>
<Location
uuid = "6FD388C0-50AA-4843-A795-6C62C17947D2 - aa6e787a29110f68"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "closure #2 () -&gt; () in DefaultProject.CONSTANT.loadData(() -&gt; ()) -&gt; ()"
moduleName = "DefaultProject"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/darktech4/QuizKid/DefaultProject/DEFAULT_SOURCE/CONTROLL_APP/CONSTANT.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "71"
endingLineNumber = "71"
offsetFromSymbolStart = "48">
</Location>
</Locations>
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "64F113F6-3F90-410F-A6BE-5380FC5206DE"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "DefaultProject/DEFAULT_SOURCE/CONTROLL_APP/CONSTANT.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "371"
endingLineNumber = "371"
landmarkName = "pareDataCombine(_:completions:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
</Breakpoints>
</Bucket>
143 changes: 97 additions & 46 deletions DefaultProject/DEFAULT_SOURCE/CONTROLL_APP/CONSTANT.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import Foundation
import FirebaseDatabase
import SwiftUI
import Combine

class CONSTANT{
static var SHARED = CONSTANT()
Expand All @@ -17,6 +18,7 @@ class CONSTANT{
static var DATA_URL = "/data/ver_1"

var OBSERVER_MANIFEST: Any?
var cancellable: AnyCancellable?

@AppStorage("TIME_INSTALLED_APP") var TIME_INSTALLED_APP = 0
@AppStorage("SAVE_VERSION_APP") var SAVE_VERSION_APP = ""
Expand Down Expand Up @@ -64,17 +66,10 @@ class CONSTANT{
}
}
else {
if let manifestPath = Bundle.main.path(forResource: "data", ofType: "json"){
if let data = NSData(contentsOfFile: manifestPath) {
do {
let json = try JSON(data: data as Data, options: JSONSerialization.ReadingOptions.allowFragments)
self.pareData(json, completion: {
completion()
})
} catch _ {
debugPrint("error")
}
}
if let manifestPath = Bundle.main.url(forResource: "data", withExtension: "json"){
self.pareDataCombine(manifestPath, completions: {
completion()
})
}
}
}
Expand Down Expand Up @@ -185,7 +180,7 @@ struct APP_NAVIGATION_STRUCT{
var COLOR_BUTTON_TEXT = "ffffff"
}

struct QUIZ {
struct QUIZ: Codable {
var id: String = ""
var answer: String = ""
var question: String = ""
Expand All @@ -196,6 +191,16 @@ struct QUIZ {
var img: String = ""
}

struct QuizDataCombine: Codable {
var listQuestionsMath: [QUIZ]
var listQuestionsColor: [QUIZ]
var listQuestionsListen: [QUIZ]
var listQuestionsSurrounding: [QUIZ]
var listQuestionsHistory: [QUIZ]
var listListenAndRepeat: [QUIZ]
var listWriting: [QUIZ]
}

extension CONSTANT{
func pareManifest(_ json: JSON, completion: @escaping ()->Void){
//VERSION_APP
Expand Down Expand Up @@ -310,75 +315,121 @@ extension CONSTANT{

//data
func pareData(_ json: JSON, completion: @escaping ()->Void){
//DATA_COLOR
let jsonColors = json["listQuestionsColor"]
self.parseJson(json: json) { data in
self.DATA_COLOR = data.listQuestionsColor

self.DATA_HISTORY = data.listQuestionsHistory

self.DATA_LISTEN = data.listQuestionsListen

self.DATA_MATH = data.listQuestionsMath

self.DATA_SURROUNDING = data.listQuestionsSurrounding

self.DATA_WRITING = data.listWriting

self.DATA_LISTEN_AND_REPEAT = data.listListenAndRepeat
}
}

func pareDataCombine(_ jsonURL: URL, completions: @escaping ()->Void){
let publisher = URLSession.shared.dataTaskPublisher(for: jsonURL)

cancellable = publisher
.map(\.data)
// .decode(type: QUIZ.self, decoder: JSONDecoder())
.tryMap { data -> QuizDataCombine in
let json = try JSON(data: data)
var save: QuizDataCombine?

self.parseJson(json: json){ data in
save = QuizDataCombine(
listQuestionsMath: data.listQuestionsMath,
listQuestionsColor: data.listQuestionsMath,
listQuestionsListen: data.listQuestionsMath,
listQuestionsSurrounding: data.listQuestionsSurrounding,
listQuestionsHistory: data.listQuestionsHistory,
listListenAndRepeat: data.listListenAndRepeat,
listWriting: data.listWriting
)
}
return save!
}
.receive(on: DispatchQueue.main)
.sink(
receiveCompletion: { completion in
switch completion {
case .finished:
print("Request completed successfully.")
completions()
case .failure(let error):
print("Request failed with error: \(error)")
completions()
}
},
receiveValue: { value in
self.DATA_MATH = value.listQuestionsMath
self.DATA_HISTORY = value.listQuestionsHistory
self.DATA_COLOR = value.listQuestionsColor
self.DATA_LISTEN = value.listQuestionsListen
self.DATA_SURROUNDING = value.listQuestionsSurrounding
self.DATA_LISTEN_AND_REPEAT = value.listListenAndRepeat
self.DATA_WRITING = value.listWriting
}
)
}

func parseJson(json: JSON, completion: @escaping (QuizDataCombine) -> Void){

let jsonColors = json["listQuestionsColor"]
var listColor: [QUIZ] = []
for (_, json) : (String, JSON) in jsonColors{
listColor.append(QUIZ(id: json["id"].stringValue, answer: json["answer"].stringValue, question: json["question"].stringValue, a: json["a"].stringValue, b: json["b"].stringValue, c: json["c"].stringValue, d: json["d"].stringValue, img: json["img"].stringValue))
}

self.DATA_COLOR = listColor

//DATA_history
let jsonHistory = json["listQuestionsHistory"]

var listHistory: [QUIZ] = []
for (_, json) : (String, JSON) in jsonHistory{
listHistory.append(QUIZ(id: json["id"].stringValue, answer: json["answer"].stringValue, question: json["question"].stringValue, a: json["a"].stringValue, b: json["b"].stringValue, c: json["c"].stringValue, d: json["d"].stringValue, img: json["img"].stringValue))
//DATA_MATH
let jsonMath = json["listQuestionsMath"]
var listMath: [QUIZ] = []
for (_, json) : (String, JSON) in jsonMath{
listMath.append(QUIZ(id: json["id"].stringValue, answer: json["answer"].stringValue, question: json["question"].stringValue, a: json["a"].stringValue, b: json["b"].stringValue, c: json["c"].stringValue, d: json["d"].stringValue, img: json["img"].stringValue))
}

self.DATA_HISTORY = listHistory

//DATA_listen
//DATA_LISTEN
let jsonListen = json["listQuestionsListen"]

var listListen: [QUIZ] = []
for (_, json) : (String, JSON) in jsonListen{
listListen.append(QUIZ(id: json["id"].stringValue, answer: json["answer"].stringValue, question: json["question"].stringValue, a: json["a"].stringValue, b: json["b"].stringValue, c: json["c"].stringValue, d: json["d"].stringValue, img: json["img"].stringValue))
}

self.DATA_LISTEN = listListen

//DATA_listen
let jsonMath = json["listQuestionsMath"]

var listMath: [QUIZ] = []
for (_, json) : (String, JSON) in jsonMath{
listMath.append(QUIZ(id: json["id"].stringValue, answer: json["answer"].stringValue, question: json["question"].stringValue, a: json["a"].stringValue, b: json["b"].stringValue, c: json["c"].stringValue, d: json["d"].stringValue, img: json["img"].stringValue))
//DATA_history
let jsonHistory = json["listQuestionsHistory"]
var listHistory: [QUIZ] = []
for (_, json) : (String, JSON) in jsonHistory{
listHistory.append(QUIZ(id: json["id"].stringValue, answer: json["answer"].stringValue, question: json["question"].stringValue, a: json["a"].stringValue, b: json["b"].stringValue, c: json["c"].stringValue, d: json["d"].stringValue, img: json["img"].stringValue))
}

self.DATA_MATH = listMath

//DATA_surrounding
let jsonSurrounding = json["listQuestionsSurrounding"]

var listSurrounding: [QUIZ] = []
for (_, json) : (String, JSON) in jsonSurrounding{
listSurrounding.append(QUIZ(id: json["id"].stringValue, answer: json["answer"].stringValue, question: json["question"].stringValue, a: json["a"].stringValue, b: json["b"].stringValue, c: json["c"].stringValue, d: json["d"].stringValue, img: json["img"].stringValue))
}

self.DATA_SURROUNDING = listSurrounding

//DATA_writing
let jsonWriting = json["listWriting"]

var listWriting: [QUIZ] = []
for (_, json) : (String, JSON) in jsonWriting{
listWriting.append(QUIZ(id: json["id"].stringValue, answer: json["answer"].stringValue, question: json["question"].stringValue))
}

self.DATA_WRITING = listWriting


//DATA_listenRepeat
let jsonRepeat = json["listListenAndRepeat"]

var listListenRepeat: [QUIZ] = []
for (_, json) : (String, JSON) in jsonRepeat{
listListenRepeat.append(QUIZ(id: json["id"].stringValue, answer: json["answer"].stringValue, question: json["question"].stringValue, a: json["a"].stringValue, b: json["b"].stringValue, c: json["c"].stringValue, d: json["d"].stringValue, img: json["img"].stringValue))
}

self.DATA_LISTEN_AND_REPEAT = listListenRepeat
completion(QuizDataCombine(listQuestionsMath: listMath, listQuestionsColor: listColor, listQuestionsListen: listListen,listQuestionsSurrounding: listSurrounding, listQuestionsHistory: listHistory,listListenAndRepeat: listListenRepeat,listWriting: listWriting))
}

//Load old
Expand All @@ -394,11 +445,11 @@ extension CONSTANT{
}
}
}

func pareManifestOld(_ json: JSON, completion: @escaping ()->Void){
parseOther(json)
completion()
}

}

extension CONSTANT{
Expand Down
5 changes: 3 additions & 2 deletions DefaultProject/DefaultProjectApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,9 @@ struct RootView: SwiftUI.View {
})
}

CONSTANT.SHARED.loadData{}
CONSTANT.SHARED.loadData{
CONSTANT.SHARED.cancellable?.cancel()
}
})
.onChange(of: appController.INDEX_TABBAR, perform: { b in
if User.isShowInterstitial() == false{
Expand Down Expand Up @@ -143,7 +145,6 @@ struct RootView: SwiftUI.View {
})
}


func checkDeviceLanguage() -> String {
let preferredLanguage = Locale.preferredLanguages[0]
return preferredLanguage
Expand Down
Loading

0 comments on commit 784f17b

Please sign in to comment.