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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
Ravenenok
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 37
11.09.2012, 10:36     Запуск метода с параметрами в новом потоке #1
Стандартная ситуация, есть формочка, нажимаем кнопку, запускается сложная операция, форма подвисает, решение - вывести этот процесс в отдельный поток, не вопрос, делаем, всё работает. Только проблема в том, что я разобрался как метод без параметров запускать, а как это сделать с параметрами я не понимаю, референс эпловский читал, но не понял. Пытался найти примеры, но ничего внятного не нашел.

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

Так у меня сейчас реализован вызов метода в новом потоке без параметров.
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++)
 { ... }
...
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zulkis
 Аватар для zulkis
681 / 608 / 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
 Аватар для zulkis
681 / 608 / 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
 Аватар для zulkis
681 / 608 / 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
 Аватар для Splitter
201 / 143 / 5
Регистрация: 13.01.2009
Сообщений: 554
12.09.2012, 15:23     Запуск метода с параметрами в новом потоке #8
Цитата Сообщение от Ravenenok Посмотреть сообщение
Попробую разобраться.
это называется GCD весьма полезная штука )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2012, 17:22     Запуск метода с параметрами в новом потоке
Еще ссылки по теме:

Переопределение метода только в iOS >= 7.0 Objective-C
Objective-C Переопределение метода в сабклассе делегата
Objective-C Как из одного метода обратиться к переменной другого?
Вызов блока с переменными параметрами Objective-C
Вызов метода базового класса, если он был переопределён в наследнике Objective-C

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

Или воспользуйтесь поиском по форуму:
Ravenenok
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 37
12.09.2012, 17:22  [ТС]     Запуск метода с параметрами в новом потоке #9
Цитата Сообщение от Splitter Посмотреть сообщение
это называется GCD весьма полезная штука )
Я вчера уже почитал, применил кусок у себя в программе.
Yandex
Объявления
12.09.2012, 17:22     Запуск метода с параметрами в новом потоке
Ответ Создать тему
Опции темы

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