2009-10-28 2 views
1

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

[Проблема Условия]

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

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

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

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

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

[Мысли]

performSelector не полезно, потому что один мне нужно поставить это метод с @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] билет = [сервис fetchFeedWithQuery: запрос делегат: себя didFinishSelector: @selector (calendarEventsTicket: finishedWithFeed: ошибка :)];

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

retInvo = [NSInvocation invocationWithMethodSignature: [самостоятельного methodSignatureForSelector: @selector (finishMethod: withArray :)]]; [retInvo setTarget: self];

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

[retInvo setArgument: & calendar atIndex: 2]; [retInvo setArgument: & события atIndex: 3];

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

ответ

0

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

+0

Очень мало людей когда-либо должны напрямую использовать NSInvocation. –

+0

Тогда что бы вы порекомендовали? – Tim

+0

Тим, спасибо, что оставил мне ключевое слово, NSInvocation. Я сделал некоторое чтение на нем и сделал некоторый прогресс. Я не мог опубликовать длинное сообщение здесь, поэтому я редактировал вопрос. Пожалуйста, проверьте его. Спасибо. – Katsumi

0

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

+0

NSD, спасибо за ваш комментарий. Я попытался использовать мой обратный вызов. Дело в том, что мой callback вызывается несколько раз. Обратный вызов накапливает объект в NSMutableArray. Как-то мне нужно выяснить, все ли обратные вызовы выполнены до вызова соответствующего UIView setNeedsDisplay. На данный момент вызов setNeedsDisplay не меняет вид (он вызывается перед обратным вызовом) Да, массив получает правильный результат, поэтому еще один шаг к рассмотрению ... Katsumi – Katsumi