2013-07-22 7 views
0

Извините, мой английский, я французский.iOS Использовать обратный вызов

Итак, я новичок в разработке iOS. Я разработал метод, который должен вызвать функцию обратного вызова после async-задачи. Я сделал поиск о селекторов, но я не могу понять, как это работает ...

Это мой код:

NSString *const BaseURLString = @"http://mywebsite.fr/"; 
+ (void) getAdverts:(SEL *)myselector { 
// 1 
NSURL *baseURL = [NSURL URLWithString:[NSString stringWithFormat:BaseURLString]]; 

// 2 
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:baseURL]; 
[client registerHTTPOperationClass:[AFJSONRequestOperation class]]; 
[client setDefaultHeader:@"Accept" value:@"application/json"]; 
[client getPath:@"jsoncall" 
    parameters:nil 
     success:^(AFHTTPRequestOperation *operation, id responseObject) { 
      NSDictionary *jsonDict = (NSDictionary *) responseObject; 
      NSArray *adverts = [jsonDict objectForKey:@"Advert"]; 

      NSMutableArray *advertList = [[NSMutableArray alloc] init]; 
      Advert *advert = [[Advert alloc] init]; 

      [adverts enumerateObjectsUsingBlock:^(id obj ,NSUInteger idx, BOOL *stop){ 
       advert.identifier = [(NSNumber *)[obj objectForKey:@"id"] integerValue]; 
       advert.title = [obj objectForKey:@"title"]; 
       advert.size = [obj objectForKey:@"size"]; 
       NSLog(@"ID:%d Size:%@", advert.identifier, advert.size); 
       [advertList addObject:advert]; 
      }]; 

      // Use selector to callback a function 
      [self performSelector:myselector withObject:@"test"]; 
     } 
     failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather" 
                 message:[NSString stringWithFormat:@"%@",error] 
                 delegate:nil 
               cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [av show]; 

     } 
]; 
} 

«вызывающий» код:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [ServerHelper getAdverts:@selector(mySelector)]; 
} 

- (void)mySelector 
{ 
    NSLog(@"selector ok"); 
} 

Здесь ошибка: непризнанным селектор послал к классу

большое спасибо

+0

В чем проблема с кодом? –

+0

Пожалуйста, посмотрите мое редактирование (ошибка: нераспознанный селектор, отправленный классу) –

+1

Это выглядит подозрительно '[self performSelector: myselector withObject: @" test "];' Почему вы передаете параметр селектору, который не принимает никаких параметров ? – Abizern

ответ

0

типа вы ищете селектор (SEL), и вы получите селектор метода, как это:

SEL littleSelector = @selector(littleMethod); 

Если метод принимает параметры, вы просто положить :, куда они идут, как это:

SEL littleSelector = @selector(littleMethodWithSomething:andSomethingElse:); 

Кроме того, методы на самом деле не являются функциями, они используются для отправки сообщений определенному классу (при запуске с +) или конкретным экземпляром его (при запуске -). Функции - это C-тип, который действительно не имеет «целевых» методов.

После того, как вы получите селектор, вы вызываете этот метод на вашей цели (будь то класс или экземпляр), как это:

[target performSelector:someSelector]; 

Хорошим примером этого является UIControl «s addTarget:action:forControlEvents: метод обычно используется при создании UIButton или некоторые другие объекты управления программным способом.

2

Вы не совсем правильно передаете селектор, и вы не вызываете его должным образом.

Вы не хотите указывать указатель на SEL, вам просто нужен SEL. Метод должен быть:

+ (void) getAdverts:(SEL)myselector { 

Однако, на данный момент у вас есть:

[self performSelector:myselector withObject:@"test"]; 

В этом случае self относится к классу, в котором был определен метод getAdverts класса. Не экземпляр класса, для которого был объявлен экземпляр mySelector.

Если вы хотите сделать это таким образом, вам, вероятно, потребуется передать объект, на который вы хотите вызвать селектор.Ваш метод getAdverts должен быть что-то вроде:

+ (void) getAdvertsWithTarget:(id)target selector:(SEL)myselector { 

, а затем вы обратного вызова, используя что-то вроде:

[target performSelector:myselector]; 

и называют его следующим образом:

[ServerHelper getAdvertsWithTarget:self selector:@selector(mySelector)]; 
0

Если вы измените его :

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [ServerHelper getAdverts:@selector(mySelector:)]; 
} 

- (void)mySelector:(id)object 
{ 
    NSLog(@"selector ok"); 
} 

Он должен работать. ум: после селектора и добавленный аргумент объекта.

Смежные вопросы