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

callback functions - Objective-C

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
jarmen kell
2 / 2 / 0
Регистрация: 17.05.2012
Сообщений: 26
16.08.2012, 10:30     callback functions #1
Всем добое время суток !
Люди объясните на пальцах что такое callback function в objective - c я перечитал всю документацию, кочана читал, SDK. Нашел такое пнятие как - blocks но так и нифига не понял зачем она где и в каких случаях ее применять. Очень нужно простое понимание на примерах
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2012, 10:30     callback functions
Посмотрите здесь:

C++ Functions
Basic Just Basic. некоторыми functions
Templates and pointers to functions C++
Functions в SQLServer2000! HELP, pls! SQL Server
PHP Кто разбирается в DOMXML Functions?
constexpr static functions C++
Visual Studio ListBoxes и Sub/Functions
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
16.08.2012, 12:10     callback functions #2
Блок в objC - Это фича языка, которая позволяет использовать Анонимные функции.
А callback - это общее понятие. Так называемая Функция обратного вызова(Позвони обратно(англ. дословно))
Почитайте, насколько я помню там разжевывали.
jarmen kell
2 / 2 / 0
Регистрация: 17.05.2012
Сообщений: 26
23.08.2012, 16:51  [ТС]     callback functions #3
Я вот хотел вас спросить а как можно организовать callback при при помощи blocks
Например у меня есть запрос и 4 connection function
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
-(void)request
{
    NSString *str = [[NSString alloc] initWithString:@"iBmAdN"];
    NSLog(@"Posting string to server news = %@", str);
    NSData *postDataMap = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    NSString *postrLength = [NSString stringWithFormat:@"%d", [postDataMap length]];
    NSLog(@"Length of request news is = %@", postrLength);
    
    
    NSString *url = [[NSString alloc] initWithString:@"http:/...."];
    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc]  init] autorelease];
    [request setURL:[NSURL URLWithString:url]];
    [request setHTTPMethod:@"POST"];
    [request setValue:postrLength forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Contet-Type"];
    [request setHTTPBody:postDataMap];
    
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
   
}
 
//================================Connection=================================
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    receivedData = [[NSMutableData alloc] init];
    NSLog(@"Received response");
}
 
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [receivedData appendData:data];
    NSLog(@"Received Data");
}
 
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    [receivedData release];
    [connection release];
    NSLog(@"ERROR!!!");
}
 
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"Success! Received bytes %d", [receivedData length]);
}
Помогите вытащить receiveData в другой класс
Все это находиться в Singletone как нужно правльно вызывать а то все мои попытки тщетны
Я вызываю это все напримере. Из класса 1 я вызываю класс 2( Это Sinleton тут формируется запрос),а из класса 2 надо передать в класс 3
Найчите граммотно как все это сделать.
Спасибо
Vorona
Peace 2 all shining faces
 Аватар для Vorona
661 / 523 / 44
Регистрация: 05.03.2010
Сообщений: 1,270
23.08.2012, 20:10     callback functions #4
во-первых, я думаю нужно все-таки освободить память от объекта, перед тем как ее выделить, так как это не конструктор и мало ли, пошлют это сообщение несколько раз - будет утечка памяти
Objective-C
1
2
3
4
5
6
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [receivedData release];
    receivedData = [[NSMutableData alloc] init];
    NSLog(@"Received response");
}
и тут, если не ошибаюсь, уже не ваша забота освобождать память из-под connection
Objective-C
1
2
3
4
5
6
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    [receivedData release];
    // [connection release];
    NSLog(@"ERROR!!!");
}
а передать receivedData в другой класс можно по-разному, я бы реализовал это при помощи делегации либо по паттерну Observer.

Впринципе работу с интернетом я только начал изучать, но тут, мне кажется, вопрос больше по дизайну.
jarmen kell
2 / 2 / 0
Регистрация: 17.05.2012
Сообщений: 26
23.08.2012, 21:05  [ТС]     callback functions #5
Да Бог с этим интернетом Вопрос в том что как передать обработанные данные функции в другую функцию
надо отсюдого отправить в другую фунуцию
-(void)connectionDidFinishLoading : (NSURLConnection *)connection
{
NSLog(@"Success! Received bytes %d", [receivedData length]);
}
можно как вы говорите через делегат но больно уж гемороино получается хочется через блоки
Vorona
Peace 2 all shining faces
 Аватар для Vorona
661 / 523 / 44
Регистрация: 05.03.2010
Сообщений: 1,270
23.08.2012, 21:41     callback functions #6
честно не встречал в подобных ситуациях реализацию с помощью блоков.
не хочу вам навязывать делегацию и observer, но если вам нужно будет граммотно расширить функционал до того, чтобы этот синглтон юзало несколько классов а не один, то вам достаточно будет лишь реализовать необходимый протокол и подписаться на его(синглтон-класса) обновления, это очень удобно и просто

когда я начинал разбираться в принципе работы делегации, мне это тоже казалось геморным но проведя 2-3 часа с документацией и мыслями о том, где и как это можно использовать, я понял принцип и уже не мог понять почему я вообще потратил на это несколько часов, а не минут.

насчет блоков в этой ситуации сорри, может кто другой подскажет.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
24.08.2012, 05:30     callback functions #7
Цитата Сообщение от Vorona Посмотреть сообщение
честно не встречал в подобных ситуациях реализацию с помощью блоков.
не хочу вам навязывать делегацию и observer, но если вам нужно будет граммотно расширить функционал до того, чтобы этот синглтон юзало несколько классов а не один, то вам достаточно будет лишь реализовать необходимый протокол и подписаться на его(синглтон-класса) обновления, это очень удобно и просто

когда я начинал разбираться в принципе работы делегации, мне это тоже казалось геморным но проведя 2-3 часа с документацией и мыслями о том, где и как это можно использовать, я понял принцип и уже не мог понять почему я вообще потратил на это несколько часов, а не минут.

насчет блоков в этой ситуации сорри, может кто другой подскажет.
Не встречали?
Скачайте с гитхаба AFNetworking - и почитайте код.

P.S. По сравнению с оберткой блоками, обработка "сетевых" callback'ов через делегирование - это ад.
Vorona
Peace 2 all shining faces
 Аватар для Vorona
661 / 523 / 44
Регистрация: 05.03.2010
Сообщений: 1,270
24.08.2012, 12:00     callback functions #8
значит стоит уделить больше внимания блокам)
zulkis, а сами вы часто используете их на практике?
и можете привести пример их применения в данном контексте?
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
24.08.2012, 13:27     callback functions #9
Есть у меня пример. Был класс, написанный не мной, для работы с сокетами, все колбэки делегацией.
Я инкапсулировал блок в объект, который передавался мне в итоге в делегат, и оттуда(с метода делегата) вызывал свой блок с параметрами. В итоге никаких лишних проверок в классе, которые не должен знать о том, о чем он знать не должен.

+ вам не нужно вспоминать где же идет обработка, искать метод делегата, тело блока обычно пишется прямо внутри метода.
Vorona
Peace 2 all shining faces
 Аватар для Vorona
661 / 523 / 44
Регистрация: 05.03.2010
Сообщений: 1,270
25.08.2012, 19:08     callback functions #10
zulkis, спасибо разобрался с блоками - мощно и впринципе просто, как и лямбда выражения в C#
jarmen kell, если все еще не совсем понятно, как это сделать, то вот две отличные статьи, в которых все доступно расписано, и в конце второй статьи в разделе Putting It All Together демонстрируется маленькие пример создания и использования callback functions, как раз для вашей задачи:
http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1
http://pragmaticstudio.com/blog/2010/9/15/ios4-blocks-2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2012, 20:05     callback functions
Еще ссылки по теме:

Construct the graphs of functions MathCAD
Toggle Functions jQuery
For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента C++
PHP БД Переход на SQLSRV Functions
The accessor functions Lisp

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

Или воспользуйтесь поиском по форуму:
jarmen kell
2 / 2 / 0
Регистрация: 17.05.2012
Сообщений: 26
25.08.2012, 20:05  [ТС]     callback functions #11
Vorona
Огромное вам спасибо за статьи впринципе я тоже разобрался.
У меня возникла одна идея в решении моей проблемы только пока незнаю как грамотно реализовать а что eсли создать класс который будет принимать блок и будут описаны 4 метода те самые connections

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    receivedData = [[NSMutableData alloc] init];
    NSLog(@"Received response");
}
 
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [receivedData appendData:data];
    NSLog(@"Received Data");
}
 
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    [receivedData release];
    [connection release];
    NSLog(@"ERROR!!!");
}
 
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"Success! Received bytes %d", [receivedData length]);
 
}
-(void)connectionDidFinishLoadingNSURLConnection *)connection
{
здесь будет блок типо
[receivedData length]
void(^block)(NSMutableData * arg){return;};
}

Во втором классе я создаю переменную типо
block{Singleton.parserBills(received data;};
[Singleton instance] request:a: variable]];
Class * variable = [class alloc] initWithBlock: block];

А в моем синглтоне где создаю коннектион
[[NSURLConnection alloc] initWithRequest:request delegate:variable];
Yandex
Объявления
25.08.2012, 20:05     callback functions
Ответ Создать тему
Опции темы

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