2016-01-09 3 views
1

У меня есть сетевой метод, который запрашивает данные с сервера, а затем отображает его на виде таблицы. Но проблема в том, что сервер не отвечает или загрузка занимает слишком много времени. Я хочу иметь возможность просто перезагрузить табличное представление с уже полученными данными. Я попытался использовать метод performSelector:withObject:afterDelay:, но этот метод будет выполнять селектор, даже если загрузка завершена. Я попытался создать значение bool, чтобы определить, закончилась ли загрузка, когда вызывается селектор, но это создаст overlap, если загрузка уже завершена, а затем пользователь выполнил другое сетевое действие, которое селектор еще не вызвал, создав ложное действие из-за это перекрытие. Я хочу метод, который делает ограничение по времени, но может быть отменен, если загрузка уже завершена. Каков наилучший способ реализации этого? или есть лучший способ сделать то, что я хочу?Метод ограничения времени в объекте C

+1

Показать ваш код, пожалуйста. Ответ полностью зависит от деталей _how_ вы делаете этот запрос данных. – matt

+0

Что касается вопроса * перекрытия *, вы можете создавать и совместно использовать NSMutableArray для каждого задания и вставлять в него любое значение (например, «@» «) в« задание закончено »или любое другое событие, которое вы хотите. NSMutableArray по умолчанию является потокобезопасным, iirc (вы должны это проверить). – user3125367

+0

'NSMutableArray' - ** нет ** нить безопасный. – Avi

ответ

2

После завершения загрузки можно отменить свой вызов performSelector:withObject:afterDelay:. Например, когда загрузка завершится, вы можете позвонить

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:] 

Здесь target есть объект, который называется performSelector:withObject:afterDelay: на, selector это селектор вы прошли, object это объект, который вы прошли (или nil).


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

[NSObject cancelPreviousPerformRequestsWithTarget:yourObject]; 

yourObject, вероятно, будет в этом случае self.

+0

WOW спасибо, это ответ, который я искал. – samitarmum

+0

Я рад, что это помогло :) –

-1

Похоже, что вы ищете NSTimer. Вы можете запустить таймер окончания, когда начнется сетевая активность, и аннулировать таймер, если работа закончится до срабатывания таймера.

+0

Представьте это, инициируется nstimer -> начинается загрузка, а затем завершается, но таймер еще не достиг своего предела -> начинается другая загрузка -> пока загрузка происходит, предыдущий nstimer только что достиг своего предела -> перезагружает таблицу, а все данные еще не загружены, хотя это произошло всего за 1 секунду до этого. – samitarmum