(iPhone) как ждать завершения метода, один из его аргументов - вызов селектора - PullRequest
1 голос
/ 28 октября 2009

Я застрял с этой проблемой, похоже на многопоточность, но я довольно новичок в такого рода темах. Мне нужна помощь экспертов! !!!

[Проблемные условия]

  1. Необходимо вызвать метод, который имеет 3 аргумента, один аргумент @selector( myMethod: )

  2. Нужно позвонить (1) несколько раз

  3. Необходимо убедиться, что каждый из селекторов (1) сделан, чтобы перейти к следующим шагам

  4. @selector( myMethod: ) настраивает xArray, массив объекта X, чтобы сделать его простым

  5. Итак, логически у меня есть один xArray с многопоточным доступом к нему, и каким-то образом нужно обработать все элементы xArray ...

[Мысли]

executeSelector бесполезен, потому что мне нужно указать метод с аргументом @selector ...

[Псевдо-Code]

// The Starting Point of Alghorithm
- (void)initialCallerMethod {

  for(int i=0; i < [calendarArray count]; i++) {
    calendar = [calendarArray objectAtIndex:i];  
    // fetch the events feed
    NSString* alternateLink = [calendar alternateLink];
    NSURL* feedURL = [NSURL URLWithString:alternateLink];
    if (feedURL) {

      [self setEventFeed:nil];

      GDataQueryCalendar *query = [GDataQueryCalendar calendarQueryWithFeedURL:feedURL];
      [query setMaxResults:100]; 

      GDataServiceGoogleCalendar *service = [[[CalendarService alloc] init] calendarService];
      GDataServiceTicket *ticket;
      ticket = [service fetchFeedWithQuery:query 
        delegate:self
        didFinishSelector:@selector(calendarEventsTicket:finishedWithFeed:error:)];

      if ([self eventFetchError] == nil) {
          // query succeeded
 NSLog(@"Query succeeded");
 [self howToDoThis];    
      }
    }
  }
}

// @selector's method with 3 arguments
- (void)calendarEventsTicket:(GDataServiceTicket *)ticket
            finishedWithFeed:(GDataFeedCalendarEvent *)feed
                       error:(NSError *)error {

 [self setEventFeed:feed];
}

//
// Somewhere I want to do something like this
//
- (void) howToDoThis {
  GDataFeedCalendarEvent* feed = [self eventFeed];
  NSArray *entries = [feed entries];

  // for now, I get's zero...
  NSLog(@"FEED ENTRIES COUNT: %d", [entries count]);

  for (int idx = 0; idx < [entries count]; idx++) {
    // to make it simple, I'm just accumulating elements of array
    id elm = [entries objectAtIndex:idx];
    [anArrayToSumUp addObject: elm ]; 
   }
}

Я действительно переполнен ...

Пожалуйста, совет ...

Катсуй

==== некоторый прогресс или борьба ... 2009/10/29

Тим, я немного читал для NSInvocation и NSInvocationOperation. Это звучит полезно. Теперь вы знаете, как передать «адрес селектора»? вы видите, я могу установить цель, селектор и аргументы с NSInvocation но как я могу передать адрес @selector (...)?

[Перед использованием NSInvocation] ticket = [служба fetchFeedWithQuery: запрос Делегат: самостоятельно didFinishSelector: @selector (calendarEventsTicket: finishedWithFeed: ошибка :)];

[Попытка использовать NSInvocation, сближение за исключением передачи селектора в качестве аргумента]

retInvo = [NSInvocation invocationWithMethodSignature: [self methodSignatureForSelector: @selector (finishMethod: withArray :)]]; [retInvo setTarget: self];

// * Это не нормально * [retInvo setSelector: @selector (finishMethod: withArray :)]; // Это не нормально

[retInvo setArgument: & calendar atIndex: 2]; [retInvo setArgument: & events atIndex: 3];

NSInvocationOperation * invoFinishOperation = [[NSInvocationOperation alloc] initWithInvocation: retInvo];

Ответы [ 2 ]

0 голосов
/ 28 октября 2009

Ожидание возврата этих методов приведет к зависанию вашего пользовательского интерфейса. Вот почему они выполняются асинхронно и дают вам обратный вызов. Метод, который вы предоставляете в качестве упомянутого обратного вызова, - это то, что должно отвечать за сообщение остальной части вашего приложения, что оно завершило ожидание.

0 голосов
/ 28 октября 2009

Чтобы справиться с необходимостью вызова методов с селекторами в качестве аргументов, я бы посмотрел на NSInvocation . Экземпляр NSInvocation - это, по сути, вызов метода, превращенный в объект - вы указываете цель и серию аргументов, затем вызываете invoke при вызове, и он запускается, как если бы это был прямой вызов метода.

...