Форум программистов, компьютерный форум, киберфорум
Наши страницы

Objective-C

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
jarmen kell
2 / 2 / 0
Регистрация: 17.05.2012
Сообщений: 26
#1

callback functions - Objective-C

16.08.2012, 10:30. Просмотров 2379. Ответов 10
Метки нет (Все метки)

Всем добое время суток !
Люди объясните на пальцах что такое callback function в objective - c я перечитал всю документацию, кочана читал, SDK. Нашел такое пнятие как - blocks но так и нифига не понял зачем она где и в каких случаях ее применять. Очень нужно простое понимание на примерах
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2012, 10:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос callback functions (Objective-C):

For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента - C++
Изучаю контейнеры и алгоритмы stl по Майерсу . С непривычки слегка охренел и запутался в них . В общем есть у меня простой вызов...

Functions - C++
1)Даны два массива из n целых чисел каждый. Определить, в каком из них больше положительных элементов. Пример ввода (формат...

Toggle Functions - jQuery
Подскажите. Я вот делаю одностраничный сайт - визитку. Например имеется 5 дивов и 5 ссылок(меню). Хочу сделать, чтобы при клике на один из...

ListBoxes и Sub/Functions - Visual Studio
У меня программа, которая считает кол-во рулонов обоев по L, W, H и покрытию 1 рулона. мне нужно использовать Sub/Functions - но для...

The accessor functions - Lisp
Пишу код для Ханойских башен. Одним из заданием является: "Define an appropriately named state constructor and appropriately named state...

Just Basic. некоторыми functions - Basic
Доброго вечера уважаемые программисты. Я учусь за границей на программиста и сейчас на первом курсе ввод в программирование проходим с...

10
zulkis
683 / 610 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
16.08.2012, 12:10 #2
Блок в objC - Это фича языка, которая позволяет использовать Анонимные функции.
А callback - это общее понятие. Так называемая Функция обратного вызова(Позвони обратно(англ. дословно))
Почитайте, насколько я помню там разжевывали.
1
jarmen kell
2 / 2 / 0
Регистрация: 17.05.2012
Сообщений: 26
23.08.2012, 16:51  [ТС] #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
Найчите граммотно как все это сделать.
Спасибо
0
Vorona
Peace 2 all shining faces
670 / 532 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
23.08.2012, 20:10 #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.

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

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

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

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

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

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

+ вам не нужно вспоминать где же идет обработка, искать метод делегата, тело блока обычно пишется прямо внутри метода.
1
Vorona
Peace 2 all shining faces
670 / 532 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
25.08.2012, 19:08 #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
1
jarmen kell
2 / 2 / 0
Регистрация: 17.05.2012
Сообщений: 26
25.08.2012, 20:05  [ТС] #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];
0
25.08.2012, 20:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2012, 20:05
Привет! Вот еще темы с ответами:

Functions в SQLServer2000! HELP, pls! - SQL Server
Можно ли в SQLServer2000 написать функцию, которая бы возвращала некое числовое значение, а в теле этой функции выполнять SELECT, FETCH и...

constexpr static functions - C++
Почему нижеприведенный код не работает на gcc 4.7.1.? собственно как и на clang #include <iostream> class C1 { public: ...

Переход на SQLSRV Functions - PHP БД
Привет. хочу с mssql function перейти на SQLSRV Functions. mssql_fetch_assoc в SQLSRV нету. как ее можна заменить?

Construct the graphs of functions - MathCAD
Construct the graphs of functions Function of two variable z=1/(arctg(y/x)) Решил на MathCAD prime 3.0, правильно ли...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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