Swift Open Api Thread - PullRequest
       13

Swift Open Api Thread

0 голосов
/ 12 ноября 2018

Я анализирую открытый API из Интернета в моем приложении. и это занимает 1 мин 15 сек, чтобы сформулировать все Это слишком долго для моего приложения.

Логика моего приложения - «Запуск страницы» -> «Поиск страницы». На странице поиска пользователь может выбрать шесть параметров (цвет, форма и т. Д.) Для фильтрации открытого Api. поэтому мое приложение должно фильтровать в соответствии с выбранным параметром, если анализ не завершен.

Мой вопрос, 1. Можно ли сократить время синтаксического анализа, например, с помощью потока или каким-либо другим способом?

  1. Если пользователь выберет опцию, прежде чем закончить формулировку открытого API, Как я могу предоставить некоторые данные, расположенные в конце строки открытого API?

  2. Есть ли лучший способ анализа и фильтрации с использованием многопоточности?

Извините, мой плохой английский. Пожалуйста, предложите лучшее решение, спасибо.

//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()
    }

}

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вы делаете это неправильно, ваш сервер должен возвращать все нужные вам страницы единовременно.

Измените способ ответа сервера тем, что вы хотите, иначе вы заставите пользователя ждать несколько небольших вызовов вместо массового возврата.

Как только вы получите массовый возврат, вы должны разобраться с ним. Гораздо быстрее ...

0 голосов
/ 12 ноября 2018

Вы запускаете это на уровне .background. Это уровень, который означает «Мне все равно, завершится ли это сегодня или, возможно, когда-либо». Нет никаких обещаний, что .background задачи будут когда-либо запланированы, и им будут предоставлены наименьшие возможные ресурсы. Если 1m15s слишком медленный, вы не имели в виду .background. Переместите его в .utility, если пользователь не ожидает его, и в .userInitiated, если пользователь ожидает его. Затем, если он все еще слишком медленный, пропустите его через инструменты и посмотрите, какая часть занимает больше всего времени. Только тогда вы должны подумать, как улучшить производительность.

...