Как быстро получить тысячи данных из API, используя Alamofire? - PullRequest
0 голосов
/ 16 ноября 2018

Я создал приложение Event, где в приложении используется для регистрации участников на событие. Список участников будет перенаправлен на URL API. Когда тянет от 20+ до 400+ участников, это занимает от 1 секунды до 3 минут. Но при привлечении тысяч участников требуется 15 минут или больше, чтобы быть законченным. Я не могу понять, является ли проблема с подключением к Интернету или устройством, поскольку на моем устройстве установлено другое приложение, в котором также извлекаются тысячи данных, но для его завершения требуется всего 5 минут. Надеюсь, я все хорошо объяснил. Пожалуйста, помогите мне решить эту проблему, потому что я нахожусь на стадии тестирования для пользователя. Если вам нужен мой код для извлечения данных, я включил ниже. Спасибо.

APIService.swift

  func getParticipants(enteredPincode: String,
                     participantType: ParticipantType,
                     completionHandler: @escaping (([Attendee]?, NetworkError?) -> Void))

{

    guard let attendeesURL = URL(string: "\(GET_PARTICIPANTS_URL)/\(enteredPincode)/\(participantType)") else {
        completionHandler(nil, .invalidURL)
        return
    }

    let sessionManager = Alamofire.SessionManager.default
    sessionManager.session.getAllTasks { (tasks) in
        tasks.forEach({ $0.cancel() })
    }

    Alamofire.request(attendeesURL, method: .get, encoding: JSONEncoding.default).responseJSON(completionHandler: { (response) in

        guard HelperMethod.reachability(responseResult: response.result) else {
            completionHandler(nil, .noNetwork)
            return
        }



        if let statusCode = response.response?.statusCode {

            switch(statusCode) {
            case 200:
            if let jsonArray = response.result.value as? [[String : Any]] {

                for anItem in jsonArray {
                    if let eventparticipants = anItem["event_participants"] as? [[String : Any]] {
                        var extractedAttendees = [Attendee]()

                        for participants in eventparticipants{
                            let attendee = Attendee.init(JSON: participants)
                            extractedAttendees.append(attendee!)
                            extractedAttendees = extractedAttendees.sorted(by: { (Obj1, Obj2) -> Bool in
                                let Obj1_Name = Obj1.lastName
                                let Obj2_Name = Obj2.lastName
                                return (Obj1_Name.localizedCompare(Obj2_Name) == .orderedAscending)
                            })
                        }
                        completionHandler(extractedAttendees, nil)
                    }
                }
            }


       case 400:
        completionHandler(nil, .badRequest)
       case 404:
        completionHandler(nil, .invalidCredentials)
       case 409:
        completionHandler(nil, .notSuccessful)
       case 500:
        completionHandler(nil, .serverError)
       default:
        completionHandler(nil, .uncapturedStatusCode)


            }
        }
    })
}

1 Ответ

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

Две идеи, которые помогут ускорить процесс.

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

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

...