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

Objective-C

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

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

11.09.2012, 10:36. Просмотров 2167. Ответов 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 Указатель на функцию с параметрами
Вызов блока с переменными параметрами Objective-C
Запуск метода в новом потоке C#
Запуск метода в новом потоке C#
Запуск метода класса в новом потоке C++
Вызов функции с двумя параметрами в новом потоке C#
Как запустить функцию в новом потоке с несколькими параметрами? Visual Basic .NET
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
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
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
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     Запуск метода с параметрами в новом потоке
Еще ссылки по теме:
PascalABC.NET Что нужно изменить, чтобы процедура запускалась с параметрами в новом потоке?
C# Запуск метода в другом потоке
Запуск метода во втором потоке C#
C# Запуск метода в отдельном потоке
Запуск метода из другого класса в потоке C#

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

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

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