Я анализирую открытый API из Интернета в моем приложении. и это занимает 1 мин 15 сек, чтобы сформулировать все Это слишком долго для моего приложения.
Логика моего приложения - «Запуск страницы» -> «Поиск страницы». На странице поиска пользователь может выбрать шесть параметров (цвет, форма и т. Д.) Для фильтрации открытого Api. поэтому мое приложение должно фильтровать в соответствии с выбранным параметром, если анализ не завершен.
Мой вопрос,
1. Можно ли сократить время синтаксического анализа, например, с помощью потока или каким-либо другим способом?
Если пользователь выберет опцию, прежде чем закончить формулировку открытого API,
Как я могу предоставить некоторые данные, расположенные в конце строки открытого API?
Есть ли лучший способ анализа и фильтрации с использованием многопоточности?
Извините, мой плохой английский. Пожалуйста, предложите лучшее решение, спасибо.
//viewDidload()
DispatchQueue.global(qos: .background).async {
for i in 1..<207 {
let url = "http://apis.data.go.kr/1470000/MdcinGrnIdntfcInfoService/getMdcinGrnIdntfcInfoList?serviceKey=VmiuEGJughm504SlGiaSfpQukd9mf27WJL2z2subLqfzG9DNUoYqKJ4KU6yHHdkrPuTo0CJwEZHGOhHqss9uFA%3D%3D&numOfRows=100&pageNo=\(i)"
guard let xmlParser = XMLParser(contentsOf: URL(string: url)!) else { return }
xmlParser.delegate = self;
xmlParser.parse()
}
}
// делегат парсера
public func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
currentElement = elementName
if (elementName == "item") {
pillItem = [String : String]()
pillName = ""
pillCompany = ""
pillImage = ""
pillFrontInprint = ""
pillBackInprint = ""
pillShape = ""
pillFrontScore = ""
pillBackScore = ""
pillFrontColor = ""
pillBackColor = ""
pillLongSize = ""
pillShortSize = ""
pillThick = ""
pillForm = ""
pillChart = ""
pillClassName = ""
pillClassNum = ""
pillEtcName = ""
}
* *} Тысяча двадцать-один
public func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if (elementName == "item") {
let pill = MFTemporaryPillModel(pillName: pillName, pillCompany: pillCompany, pillImage: pillImage, pillFrontInprint: pillFrontInprint,
pillBackInprint: pillBackInprint, pillShape: pillShape, pillFrontScore: pillFrontScore, pillBackScore: pillBackScore,
pillFrontColor: pillFrontColor, pillBackColor: pillBackColor, pillLongSize: pillLongSize, pillShortSize: pillShortSize,
pillThick: pillThick, pillForm: pillForm, pillEfficacy: pillClassName, pillChart: pillChart, pillClassName: pillClassName,
pillClassNum: pillClassNum, pillEtcName: pillEtcName)
pillDataItems.append(pill)
}
}
public func parser(_ parser: XMLParser, foundCharacters string: String) {
if (currentElement == "ITEM_NAME") { //이름
if pillName == "" {
pillName = string
}
} else if (currentElement == "ENTP_NAME") { //회사이름
if pillCompany == "" {
pillCompany = string
}
} else if (currentElement == "CHART") { //성상
if pillChart == "" {
pillChart = string
}
} else if (currentElement == "ITEM_IMAGE") {//사진
if pillImage == "" {
pillImage = string
}
} else if (currentElement == "PRINT_FRONT") {
if pillFrontInprint == "" {
pillFrontInprint = string
}
} else if (currentElement == "PRINT_BACK") {
if pillBackInprint == "" {
pillBackInprint = string
}
} else if (currentElement == "DRUG_SHAPE") {
if pillShape == "" {
pillShape = string
}
} else if (currentElement == "COLOR_CLASS1") {
if pillFrontColor == "" {
pillFrontColor = string
}
} else if (currentElement == "COLOR_CLASS2") {
if pillBackColor == "" {
pillBackColor = string
}
} else if (currentElement == "LINE_FRONT") {
if pillFrontScore == "" {
pillFrontScore = string
}
} else if (currentElement == "LINE_BACK") {
if pillBackScore == "" {
pillBackScore = string
}
} else if (currentElement == "LENG_LONG") {
if pillLongSize == "" {
pillLongSize = string
}
} else if (currentElement == "LENG_SHORT") {
if pillShortSize == "" {
pillShortSize = string
}
} else if (currentElement == "THICK") {
if pillThick == "" {
pillThick = string
}
} else if (currentElement == "CLASS_NAME") { //분류번호에 있는거
if pillClassName == "" {
pillClassName = string
}
} else if (currentElement == "CLASS_NO") { //분류 번호
if pillClassNum == "" {
pillClassNum = string
}
} else if (currentElement == "FORM_CODE_NAME") {
if pillForm == "" {
pillForm = string
}
} else if (currentElement == "ETC_OTC_NAME") { //전문 기타 이런거
if pillEtcName == "" {
pillEtcName = string
}
}
}
}
// фильтрация функции (когда пользователь выбирает опции)
func filteredPillData(filteredOption: [String : [String]]) {
DispatchQueue.global(qos: .userInitiated).async {
self.filteredData.removeAll()
for i in 0..<self.pillMap[1]!.count{
let data: MFTemporaryPillModel = self.pillMap[1]![i]
if (filteredOption["score"]?.contains(data.pillFrontScore))! && (filteredOption["color"]?.contains(data.pillFrontColor))! &&
(filteredOption["form"]?.contains(data.pillForm))! && (filteredOption["shape"]?.contains(data.pillShape))! {
self.filteredData.append(data)
self.mMFSearchPillMainView.mMFSearchPillView.mMFDisplayPillDataCollection.pillDataArray = self.filteredData
}
}
DispatchQueue.main.async {
self.mMFSearchPillMainView.mMFSearchPillView.mMFDisplayPillDataCollection.collectionView.reloadData()
}
}