2016-05-02 14 views
1

UICollectionViewでセルを選択すると、情報が表示される新しいUIViewControllerが開きます。新しいUIViewControllerUIColliectionViewのcollectionView:didDeselectItemAtIndexPathメソッドを非同期で使用する方法

- (void)collectionView:(UICollectionView *)collectionView 
didDeselectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MyClass *myClass = [myClassArray objectAtIndex:indexPath.item]; 
    [myClass MyClassInstanceMethod]; 
} 

は、いくつかの情報についてmyClassインスタンスが印刷されます。しかし、MyClassInstanceMethodで私はいくつかのデータを取得し、myClassのプロパティに割り当てるいくつかのHTTPrequestsを作る。あなたが推測するかもしれませんが、問題はHTTPrequests遅延であり、新しいビューが読み込まれる前にデータを割り当てることができません。

その後、私は私が私のUICollectionViewはそれが仕事MyClassInstanceMethod終了後に選択したセルのページを開くには聞かせなければならないことだと思います。どのように実装することができますか?前もって感謝します。私の理解として

+0

どのようにWebサービスコールを行っていますか?あなたはブロックを使っていますか? 'didSelectZzZ'と'​​ didDeselectZzZ'があるのであなたの質問は不明です。 – Larme

+0

あなたは正確に何をしたいですか?あなたの質問を正しく得られない – Lion

+0

私はブロックを使用しません。私の懸念事項/質問は簡単ですが、いくつかの特定のメソッド( 'MyClassInstanceMethod')がHTTP GETメソッドから応答を取得した後、' didDeselectItemAtIndexPath'を新しいビューと呼ぶようにします。 –

答えて

1

クラスでカプセル化されたメソッドを保持するには、MyClassInstanceMethodに補完ハンドラを配置する必要があります。 didDeselectItemAtIndexPathの内部

- (void)MyClassInstanceMethodWithCompletion:(void (^)(BOOL finished))completion { 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     // Do your HTTP Requests here 

     dispatch_async(dispatch_get_main_queue(), ^{ // This will be called just when the http requests finish 
      if (completion) { // Here you could check it out if the requests went well 
       completion(YES); // If YES return YES 
      } 
     }); 
    }); 
} 

ように:あなたは、このように呼び出すことができます。

- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath { 

    MyClass *myClass = [myClassArray objectAtIndex:indexPath.item]; 
    [myClass MyClassInstanceMethodWithCompletion:^(BOOL finished) { 
     if(finished){ 
      // Call the segue 
     } 
    }]; 

} 

私はこれが役立つことを願って。

ps:大文字のMyClassで始まるメソッド名を使用しています...通常は小文字のmyClass ...より優れています。メソッド名のクラス名を区別するだけの方が良い方法です。

+0

お返事ありがとうございました。 @ Vatsの回答に感謝します。私はasyncが必要ではないかもしれないことを知っています(しかし、私はまだ実装されていませんでした、それは必要かもしれません)。私はあなたの方法を念頭に置いておきます。私は非同期実装について知らなかった、あなたの答えはそれを明確にまとめている。 –

+0

ようこそ。 GCDの詳細については、このリンクをご覧ください:https://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1 –

3


あなたは

- (void)collectionView:(UICollectionView *)collectionView 
didDeselectItemAtIndexPath:(NSIndexPath *)indexPath; 

でHTTP呼び出しを行う必要があり、成功応答で、あなたがそれに表示する詳細を使用してのUIViewControllerを開く必要があります。

+0

あなたが正しいです、私は新しいUIViewControllerに直接セグの 'UICollectionViewCell'を行いました。今、私はそのsegueを削除し、選択メソッドで自分のhttp要求のものを行うことが良いことを参照してください、その後segueジョブを作成します。 –

+0

@DilaraAlbayrak、(情報のみ)UIViewControllerを開く別の方法は[self.storyboard instantiateViewControllerWithIdentifire:@ "viewController"]です。 – Vats

+0

ありがとう、本当に役に立ちます。あなたのやり方では、私は非同期を使う必要はありませんでした。 –

関連する問題