2010-12-02 1 views
1

все. Я хочу понять, как i shoud выдает ситуации, когда асинхронный метод имеет параметр «didFinish: @selector (SEL)». Мой пример кода:Как лучше подождать, когда асинхронный метод будет завершен в приложении iPhone?

// 
// Authentication check 
- (void)authenticationSuccess: (GDataServiceTicket*) ticket 
     authenticatedWithError: (NSError*) error { 

    if (error == nil) 
    { 
     NSLog(@"authentication success"); 
    } 
    else 
    { 
     NSLog(@"authentication error"); 
    } 
} 
// 

- (void) fetchFeedOfSpreadsheets { 

    //create and authenticate to a google spreadsheet service 
    if (!(mService)) 
    { 
     GDataServiceGoogleSpreadsheet *service = [self spreadsheetService]; 
     [mService autorelease]; 
     mService = [service retain];  
    } 

    // check autentication success (invoke "authenticationSuccess" method for debug success & error) 
    [mService authenticateWithDelegate: self 
       didAuthenticateSelector:@selector(authenticationSuccess: 
               authenticatedWithError:) ]; 


    // HERE I WANT TO MAKE A PAUSE AND WHAIT THE RESULT, EITHER I AUTHENTICATED OR NOT 
    // AND MAKE AN "IF" STATEMENT TO CONTINTUE WORKING ON SERVER, OR RETURN ERROR 


    //fetch retrieves the feed of spreadsheets entries 
    NSURL *feedURL = [ NSURL URLWithString: kGDataGoogleSpreadsheetsPrivateFullFeed ]; 
    GDataServiceTicket *ticket; 
    ticket = [mService fetchFeedWithURL: feedURL 
           delegate: self 
         didFinishSelector: @selector(spreadsheetsTicket:finishedWithFeed: 
                error:) ]; 

    // HERE I WANT TO WAIT SECOND TIME. I WANT "spreadsheetsTicket:   
    // finishedWithFeed:error:" TO PROCCEED ERROR AND PUT A FEED IN SOME NSARRAY OBJECT 
    // AND AFTER THAT I WANT TO WORK WITH THAT NSARRAY RIGHT HERE 
} 

I Понятно, что я могу нажать на код я хочу в конце «authenticationSuccess» метод секции, но также ясно, что это неправильно способ решить proble. Там существует несколько ситуаций, когда я вызываю асинхронный метод с параметром селектора, и я хочу найти решение, обеспечивающее гибкую запись кода.

Заранее спасибо.

ответ

2

В Objective-C стандартная практика заключается в том, чтобы поставить код после аутентификации в методе authenticationSucess:. Возможно, вам это не понравится, но это жизнь.

Многих люди имели такую ​​же жалобу, как вы, так на прошивке 4 и позже, есть то, что называется блоками, которые позволяют написать код, который будет выполняться после аутентификации в методе, который инициирует проверку подлинности, как в

[mService authenticateAndExecute:^{ 
       code to be executed when successfully authenticated ; 
      }   whenError:^{ 
       code to be executed when authentication failed; 
      } ]; 

Но в этом случае вам необходимо изменить API, который возможен с помощью категорий. См. this blog post от Майка Эша. У него есть много других сообщений о блоках в одном блоге, которые также очень поучительны.

+0

Спасибо за ответ, Yuji. – zkaje 2010-12-02 14:46:44

0

Если вы собираетесь использовать библиотеку, которая работает асинхронно (и, следовательно, не блокирует ваш пользовательский интерфейс), у вас должна быть веская причина попытаться заставить ее работать синхронно.

Вы должны проверить ошибку аутентификации в конце вашего метода authenticationSuccess:authenticatedWithError: и вызывать следующий запрос оттуда, если есть успех. Аналогично, в вашем spreadsheetsTicket:finishedWithFeed:error: проверьте наличие ошибки и продолжите обработку, если ее нет. Возможно, это лучший дизайн, чтобы продолжить эту работу по отдельному методу, но это зависит от вас.

Есть ли конкретная причина, по которой вы хотите использовать GData API синхронно?