Я создаю приложение для событий, в котором тысячи участников событий должны быть перечислены в UITableView
после извлечения из API.Когда интернет-соединение медленное, это влияет на получение данных, в результате чего число участников nil
увеличивается, когда пользователь нажимает кнопку participant
.Кажется, при нажатии на кнопку это прерывает процесс извлечения данных.Как я могу избежать нажатия пользователем кнопки до тех пор, пока не будет завершено извлечение данных, чтобы избежать значения nil
?В своем коде я использовал AAsquareLoading
индикацию загрузки.Но процесс загрузки останавливается, даже извлечение данных еще не сделано.Или в любом случае я мог бы уведомить пользователя, что извлечение данных все еще находится в процессе или завершено, прежде чем нажать кнопку?Надеюсь, вы могли бы помочь мне решить мою проблему.спасибо
getParticipants Функция внутри APIService
func getParticipants(enteredPincode: String,
participantType: ParticipantType,
successBlock: @escaping ([Attendee]) -> Void,
failureBlock: @escaping (Error) -> Void)
{
let attendeesURL = URL(string: "\(GET_PARTICIPANTS_URL)/\(enteredPincode)/\(participantType)")
Alamofire.request(attendeesURL!, method: .get).validate().responseJSON { (response) in
print(response)
if let error = response.error
{
failureBlock(error)
return
}
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!)
}
successBlock(extractedAttendees)
}
}
}
}
}
Dashboard.Swift
import UIKit
import AASquaresLoadin
var validPincode: String!
var event: Event!
var participants: [Attendee]!
var activeParticipants: [Attendee]!
override func viewDidLoad() {
super.viewDidLoad()
configureAALoading()
guard event != nil,
validPincode != nil else {
_ = SCLAlertView(appearance: Appearance).showError("No Event Details", subTitle: "There's no event details, please logout and try again.")
return
}
showEventDetails()
getParticipants(enteredPincode: validPincode)
}
func showEventDetails() {
self.eventNameLabel.text = "\(self.event.name.uppercased())"
self.locationLabel.text = "\(self.event.location.uppercased())"
if let dateStringFromDate = getFormattedStringFromDate(date: (self.event.startDateTime), formatString: "EEEE, MMM d, yyyy") {
self.dateTimeLabel.text = dateStringFromDate
} else {
self.dateTimeLabel.text = "-"
}
if let startDateStringFromDate = getFormattedStringFromDate(date: (self.event.startDateTime), formatString: "h:mm a") {
self.startDateTimeLabel.text = startDateStringFromDate
} else {
self.startDateTimeLabel.text = "-"
}
if let startDateStringFromDate = getFormattedStringFromDate(date: (self.event.endDateTime), formatString: "h:mm a") {
self.endDateTimeLabel.text = startDateStringFromDate
} else {
self.endDateTimeLabel.text = "-"
}
}
func getParticipants(enteredPincode: String) {
//Show Loading
self.view.squareLoading.start(0.0)
let api = APIService()
// GET ALL PARTICIPANTS
api.getParticipants(enteredPincode: validPincode, participantType: .all, successBlock: { (attendees) in
self.participants = attendees
}) { (error) in
self.view.squareLoading.stop(0.0)
_ = SCLAlertView(appearance: Appearance).showError("Network Error", subTitle: "Please check your internet connection and try again.")
return
}
//GET ACTIVE PARTICIPANTS
api.getParticipants(enteredPincode: validPincode, participantType: .active, successBlock: { (attendees) in
self.activeParticipants = attendees
self.view.squareLoading.stop(0.0)
}) { (error) in
// Hide loading view
self.view.squareLoading.stop(0.0)
_ = SCLAlertView(appearance: Appearance).showError("Network Error", subTitle: "Please check your internet connection and try again.")
return
}
}