17

タイトルが示すように、UICollectionViewを呼び出した直後にセルを更新および表示しませんreloadData。代わりに、30〜60秒後にコレクションビューが最終的に更新されるようです。私の設定は次のとおりです。

UICollectionViewストーリーボードのビューコントローラーに追加され、ビューコントローラーのセットアップdelegatedataSource標準のアウトレットセットアップ の両方が実装され、プロトタイプ化されたセルとその内部を参照numberOfSectionsInRowしますcellForItemAtIndexPathimageView

これは、Twitterにアクセスし、タイムラインを取得して変数に割り当て、ツイートを含むテーブルビューを再読み込みしてから、ツイートを調べて写真を検索し、コレクションビューにそれらのアイテムを再読み込みするコードです。

画像を表示するためにコードをコメントアウトしても、何も変わりません。

SLRequest *timelineRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:timelineURL parameters:timelineParams];
[timelineRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
    if(responseData) {
        JSONDecoder *decoder = [[JSONDecoder alloc] init];

        NSArray *timeline = [decoder objectWithData:responseData];

        [self setTwitterTableData:timeline];

        for(NSDictionary *tweet in [self twitterTableData]) {
            if(![tweet valueForKeyPath:@"entities.media"]) { continue; }

            for(NSDictionary *photo in [[tweet objectForKey:@"entities"] objectForKey:@"media"]) {
                [[self photoStreamArray] addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                                                    [photo objectForKey:@"media_url"], @"url",
                                                    [NSValue valueWithCGSize:CGSizeMake([[photo valueForKeyPath:@"sizes.large.w"] floatValue], [[photo valueForKeyPath:@"sizes.large.h"] floatValue])], @"size"
                                                    , nil]];
            }
        }

        [[self photoStreamCollectionView] reloadData];
    }
}];
4

3 に答える 3

42

これは、バックグラウンドスレッドからUIKitメソッドを呼び出す典型的な症状です。-[SLRequest performRequestWithHandler:]ドキュメントを見ると、ハンドラーはどのスレッドで実行されるかを保証しないと書かれています。

reloadData呼び出しをブロックにラップし、これをdispatch_async();に渡します。dispatch_get_main_queue()キュー引数としても渡します。

于 2013-02-11T00:46:22.837 に答える
8

更新をメインスレッドにディスパッチする必要があります。

 dispatch_async(dispatch_get_main_queue(), ^{
    [self.photoStreamCollectionView reloadData];
  });

またはSwiftの場合:

dispatch_async(dispatch_get_main_queue(), {
    self.photoStreamCollectionView.reloadData()
})
于 2015-10-14T01:00:24.967 に答える
3

Appleのコメント:アイテムが挿入または削除されているアニメーションブロックの途中でこのメソッドを呼び出さないでください。挿入と削除により、テーブルのデータが自動的に適切に更新されます。

正面:アニメーションの途中でこのメソッドを呼び出さないでください(スクロールにUICollectionViewを含めます)。

だからあなたはできる:

[self.collectionView setContentOffset:CGPointZero animated:NO];
[self.collectionView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

または、アニメーションがないことを確認してから、reloadDataを呼び出します。また

[self.collectionView performBatchUpdates:^{
//insert, delete, reload, or move operations
} completion:nil];
于 2014-05-05T17:28:39.793 に答える