Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
Ravenenok
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 37
#1

Запуск метода с параметрами в новом потоке - Objective-C

11.09.2012, 10:36. Просмотров 2185. Ответов 8
Метки нет (Все метки)

Стандартная ситуация, есть формочка, нажимаем кнопку, запускается сложная операция, форма подвисает, решение - вывести этот процесс в отдельный поток, не вопрос, делаем, всё работает. Только проблема в том, что я разобрался как метод без параметров запускать, а как это сделать с параметрами я не понимаю, референс эпловский читал, но не понял. Пытался найти примеры, но ничего внятного не нашел.

Где бы еще можно было почитать, а лучше посмотреть (анг/рус), самым идеальным вариантом был бы пример с комментариями.

Так у меня сейчас реализован вызов метода в новом потоке без параметров.
Objective-C
1
2
3
4
5
6
7
8
9
10
11
- (IBAction)countDups:(id)sender {
   [self performSelectorInBackground:@selector(findDuplicates) withObject:nil];
}
 
-(void)findDuplicates
{
...
 for(int index=0;index<self.resultList.count;index++)
 { ... }
...
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2012, 10:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запуск метода с параметрами в новом потоке (Objective-C):

Запуск метода в новом потоке - C#
private void Matrix() { for (int y = 0; y &lt; size; y++) for (int x = 0; x &lt; size; x++) ...

Запуск метода в новом потоке - C#
Добрый день, помогите решить задания, у меня есть treeview, где есть метод на события BeforeExpand, мне нужно выполнять его в новом потоке,...

Запуск метода класса в новом потоке - C++
Здравствуйте, у меня есть класс, в нём функция - необходимо вызвать эту функцию в нескольких потоках, возможно ли это?

Вызов функции с двумя параметрами в новом потоке - C#
public void Func(float A, float B){ } Thread myThreadMD1 = new Thread( Func( Aa, Bb)) myThreadMD1.Start(); Говорит что...

Как запустить функцию в новом потоке с несколькими параметрами? - Visual Basic .NET
Вся суть вопроса в заголовке. Было бы неплохо если есть маленький пример. Ибо с одним параметром то выходит, а дальше уж беда.

Что нужно изменить, чтобы процедура запускалась с параметрами в новом потоке? - PascalABC.NET
Ошибка на 10 строке: Ожидалась функция, встречена процедура ADD Что нужно изменить, что бы процедура запускалась с параметрами в новом...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
11.09.2012, 11:20 #2
Objective-C
1
2
3
4
5
6
7
8
9
10
[self performSelectorInBackground:@selector(findDuplicates:) withObject:<YOUR OBJECT>];
 
 
-(void)findDuplicates:(<YOUR_TYPE>*)YOUR_OBJECT
{
...
 for(int index=0;index<self.resultList.count;index++)
 { ... }
...
}
Ravenenok
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 37
11.09.2012, 11:59  [ТС] #3
Так просто?
А если больше 1 параметра, то (под рукой просто xcode нет):
Objective-C
1
2
3
4
5
6
7
8
9
10
[self performSelectorInBackground:@selector(findDuplicates:withExts:) withObject:folder,ext];
 
 
-(void)findDuplicates:(NSString*)inFolder withExts:(NSString*)ext
{
...
 for(int index=0;index<self.resultList.count;index++)
 { ... }
...
}
А как быть если метод что-то возвращает?
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
11.09.2012, 15:49 #4
Раз нет ни документации, ни xCode под рукой, не делайте предположений
[self performSelectorInBackground:@selector(findDuplicates:withExts withObject:folder,ext];

Objective-C
1
[self performSelectorInBackground:@selector(findDuplicates:withExts:) withObject:folder withObject:ext];
И это максимум. Больше 2х так передать нельзя.
Ravenenok
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 37
11.09.2012, 15:56  [ТС] #5
Цитата Сообщение от zulkis Посмотреть сообщение
Раз нет ни документации, ни xCode под рукой, не делайте предположений
[self performSelectorInBackground:@selector(findDuplicates:withExts withObject:folder,ext];

Objective-C
1
[self performSelectorInBackground:@selector(findDuplicates:withExts:) withObject:folder withObject:ext];
И это максимум. Больше 2х так передать нельзя.
Почитал документацию еще раз, там говорится только про 1 объект и метод не должен ничего возвращать.

C
1
2
3
4
aSelector
    A selector that identifies the method to invoke. The method should not have a significant return value and should take a single argument of type id, or no arguments.
arg
    The argument to pass to the method when it is invoked. Pass nil if the method does not take an argument.
С другой стороны, если я хочу передать ему много параметров, я же могу передать ему один массив, который будет содержать все необходимые объекты.
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
11.09.2012, 16:06 #6
А я и не говорил про упаковку множества объектов в массив.
А, фак, это я туплю. inBackground же. Нельзя так 2 объекта. Все верно.
Пользуйте блоки:
Objective-C
1
2
3
4
5
6
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
/*здесь делаете все что хотите, а потом:*/
  dispatch_async(dispatch_get_main_queue(), ^ {
  /*Главный поток*/
  });
});
Ravenenok
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 37
11.09.2012, 17:16  [ТС] #7
Цитата Сообщение от zulkis Посмотреть сообщение
А я и не говорил про упаковку множества объектов в массив.
А, фак, это я туплю. inBackground же. Нельзя так 2 объекта. Все верно.
Пользуйте блоки:
Objective-C
1
2
3
4
5
6
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
/*здесь делаете все что хотите, а потом:*/
  dispatch_async(dispatch_get_main_queue(), ^ {
  /*Главный поток*/
  });
});
Попробую разобраться.
Splitter
201 / 143 / 5
Регистрация: 13.01.2009
Сообщений: 554
12.09.2012, 15:23 #8
Цитата Сообщение от Ravenenok Посмотреть сообщение
Попробую разобраться.
это называется GCD весьма полезная штука )
Ravenenok
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 37
12.09.2012, 17:22  [ТС] #9
Цитата Сообщение от Splitter Посмотреть сообщение
это называется GCD весьма полезная штука )
Я вчера уже почитал, применил кусок у себя в программе.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2012, 17:22
Привет! Вот еще темы с ответами:

Запуск метода в другом потоке - C#
Здравствуйте) Есть отдельный поток(ListenerThread), в нем я пытаюсь обратиться к методу из другого потока. В связи с этим я получаю...

Запуск метода во втором потоке - C#
Доброго времени суток! Пробую освоить потоки, пока не очень удачно. Написал я метод который должен исчислять статистические данные и...

Запуск метода в отдельном потоке - C#
Доброго времени суток! На форме есть textBox1 и кнопка. При нажатии на кнопку, создаётся новый поток: private void...

Запуск метода класса в отдельном потоке - C++ WinAPI
Нужно запустить метод класса в отдельном потоке. Не могу понять, как реализовывать. Искал в инете хотя бы простой пример её реализации, но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.09.2012, 17:22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru