Запустите определенный метод в фоновом режиме, но

Представьте, что у меня есть метод, который я хочу вызывать в фоновом режиме.

- (void)loadView
{
    [super loadView];
    //Make a button which will fire the "buttonClicked" method
    //Make my own uitableview.
    //Fire method: "theBackGroundMethod" in the background.
}

Извините за неточность, но я постараюсь быть максимально ясным. Вот что я хочу сделать. У меня есть представление, но я на нем эту кнопку и пустой UITableView. Затем я хочу, чтобы метод BackGroundMethod запускал фон, пока он работает, я хочу иметь возможность нажать кнопку и запустить метод buttonClicked, который будет передавать данные в UITableView.

Следующее, что я пробовал с отрицательными результатами:

[self performSelectorInBackground:@selector(theBackGroundMethod) withObject:nil];

Это запускает метод BackGround, но не загружает данные, которые я запрашиваю с сервера.

[self performSelectorOnMainThread:@selector(theBackGroundMethod) withObject:nil waitUntilDone:NO];

Это запускает метод BackGround, но по какой-то причине он не позволяет мне нажимать кнопку, ну, это позволяет нажимать кнопку, но каждое действие, которое я делаю, пока метод запускает клики, помещается в очередь за ним, поэтому только когда фоновый метод выполняется x раз, когда я нажимал кнопку, обрабатывается.

Есть ли у кого-нибудь идеи, что может заблокировать использование любой из описанных выше функций PerformSelector и как их решить. Или есть полная (может быть, лучшая) идея ..?


person Totumus Maximus    schedule 10.10.2011    source источник
comment
Можете ли вы опубликовать код в своем theBackGroundMethod?   -  person kubi    schedule 10.10.2011
comment
К сожалению, я не могу опубликовать подробности. Но я могу описать работу. theBackGroundMethod самостоятельно запускает метод в каком-то другом классе и взаимодействует с сервером. Сначала метод отправляет запрос на сервер для предоставления данных. Затем он ожидает ответа и соответственно обрабатывает xml. Когда все данные обработаны, он должен вернуться к методу делегата, созданному в том же классе, что и loadView (как описано здесь).   -  person Totumus Maximus    schedule 11.10.2011
comment
Что ж, нет ничего плохого в том, как вы используете performSelectorInBackground. Проблема в вашем коде theBackGroundMethod… но его сложно отлаживать, если мы его не видим.   -  person kubi    schedule 11.10.2011
comment
Я опаздываю. Но эта ссылка полезна для вас или для всех, кому нужно вызывать метод в фоновом режиме. stackoverflow.com/questions/7055424/ios-start-background-thread< /а>   -  person Ele    schedule 18.01.2013


Ответы (3)


Если вы выполняете асинхронные запросы URL или что-то в этом роде, вам нужно запустить цикл выполнения в потоке, в котором находятся запросы. Вот почему он работает в основном потоке, в котором уже есть цикл выполнения.

person Chuck    schedule 11.10.2011
comment
Я подключаюсь к SOAP, чтобы получить свои данные. Но NSRunloop может быть очень хорошо, что мне нужно. Теперь, чтобы узнать, как это реализовать.. ^^ - person Totumus Maximus; 11.10.2011
comment
Тогда мне, вероятно, нужно будет что-то изменить в ожидании кода ответа. Который я очень не хотел там трогать. Тем не менее я не уверен, что может остановить такой фоновый поток и не обработать метод делегата, который он должен сделать и сделал в MainThread - person Totumus Maximus; 11.10.2011
comment
@kubi: он устанавливает цикл выполнения и зацикливает его в kCFRunLoopModeDefault? Я не знал об этом, и документы по потокам указывают на обратное (developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/). Мне придется перепроверить позже, но я почти уверен, что это не для вас. - person Chuck; 11.10.2011
comment
@Chuck: Ты прав, я удалил свой комментарий. - person kubi; 11.10.2011

У меня та же проблема, я использовал UITable, поэтому в методе, работающем в фоновом режиме, в конце я добавил эту строку

[self.tableView reloadData];

Я не знаю, используете ли вы табличное представление, но это может помочь вам решить вашу проблему, я должен поблагодарить вас за запуск в фоновом режиме;)

person shbli    schedule 17.10.2011
comment
Нет, это не так просто, я боюсь ;) Данные вообще не получаются. Вы предлагаете, чтобы данные не перезагружались. - person Totumus Maximus; 17.10.2011

Вместо этого попробуйте:

[NSThread detachNewThreadSelector:@selector(theBackGroundMethod:) toTarget:self withObject:nil];
person onnoweb    schedule 10.10.2011
comment
Дает мне SIGABRT, когда я запускаю его. - person Totumus Maximus; 10.10.2011
comment
@selector(theBackGroundMethod:), если ваш метод принимает входной параметр. @selector(метод BackGround), если нет. - person onnoweb; 10.10.2011
comment
ах, это, казалось, исправило sigabrt, однако это не решило мою проблему. Это дало те же отрицательные результаты, что и PerformSelectorInBackground. theBackGroundMethod запускается, но не возвращается к методу делегата, к которому он должен возвращаться в обычном режиме. - person Totumus Maximus; 11.10.2011
comment
Может быть, вызов сервера остановлен, так как он работает в фоновом режиме? Запрос отправлен, но ответа нет. - person Totumus Maximus; 11.10.2011