2010-12-02 5 views
1

皆さん。 私は非同期メソッドが "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 
} 

私は私が「authenticationSuccess」方法セクションの終わりに私が欲しいのコードをプッシュすることができ、明らかだが、それはそれはprobleを解決するために間違った方法だと、また明らかです。このようないくつかの状況があります。私はセレクタパラメータで非同期メソッドを呼び出し、柔軟なコードを書くソリューションを探したいと思っています。

ありがとうございます。

答えて

2

Objective-Cでは、authenticationSucess:メソッドで認証後にコードを実行するのが一般的です。あなたはそれが気に入らないかもしれませんが、それは人生です。

多くの人があなたと同じ苦情を持っていたので、iOSの4の 以降、

のように、あなたが認証を開始する方法で認証した後に実行するコードを記述することができ、ブロックと呼ばれるものがあります
[mService authenticateAndExecute:^{ 
       code to be executed when successfully authenticated ; 
      }   whenError:^{ 
       code to be executed when authentication failed; 
      } ]; 

この場合、カテゴリを使用して可能なAPIを変更する必要があります。 Mike Ashのthis blog postを参照してください。彼は同じブログのブロックに他の多くの記事を掲載しており、非常に有益です。

+0

答えてくれてありがとう。 – zkaje

+0

しかし、blocでgdata-objectivec-clientを変更することは、より困難な方法です。この抽象化されたロジックを作成します。/ ..so ..私は選択せず、 "didFinish:@selector"にコードを挿入しますか? – zkaje

0

非同期に動作する(したがってUIをブロックしない)ライブラリを使用する場合は、強制的に同期させることを強くお勧めします。

authenticationSuccess:authenticatedWithError:メソッドの最後に認証エラーがないかどうかを確認し、成功した場合はそこから次のリクエストを呼び出す必要があります。同様に、spreadsheetsTicket:finishedWithFeed:error:でエラーをチェックし、エラーがなければ処理を続行します。それは、別の方法でその継続的な作業を行うより良いデザインかもしれませんが、それはあなた次第です。

GData APIを同期的に使用する特別な理由はありますか?

関連する問題