0

次のコードがあります。

 [[AHPinterestAPIClient sharedClient] getPath:requestURLPath parameters:nil 
             success:^(AFHTTPRequestOperation *operation, id response) {


                 [weakSelf.backgroundQueue_ addOperationWithBlock:^{
                     [self doSomeHeavyComputation];                    


                     [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                           [weakSelf.collectionView_ setContentOffset:CGPointMake(0, 0)];
                     [weakSelf.collectionView_ reloadData];
                     [weakSelf.progressHUD_ hide:YES];
                     [[NSNotificationCenter defaultCenter] performSelector:@selector(postNotificationName:object:) withObject:@"UIScrollViewDidStopScrolling" afterDelay:0.3];
                     [weakSelf.progressHUD_ hide:YES];


                      }];

                  }];

             }
             failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                [weakSelf.progressHUD_ hide:YES];
                [weakSelf.collectionView_.pullToRefreshView stopAnimating];
                 NSLog(@"Error fetching user data!");
                 NSLog(@"%@", error);
             }];

何らかの理由で、これは iOS 5 では問題なく機能しましたが、iOS 6 では機能しませんでした (クラッシュします)。iOS 6 については、まだ NDA の対象であるため、ここでは質問しません。私が知りたいのは、上記のコードが間違っているかどうかです。はいの場合、どうすれば修正できますか。

コードを mainQueue の外側のブロック内に配置しても問題ありません。ここでやろうとしているのは、[self doSomeHeavyComputation] が完了した後にのみ NSOperationQueue mainQueue を実行することです。これは依存関係です。この依存関係を追加するにはどうすればよいですか?

アップデート:

役立つ場合のクラッシュログは次のとおりです。

ここに画像の説明を入力

4

1 に答える 1

1

ブロック内の弱い参照を「巻き戻す」ことをお勧めしますので、これを試してください:

__weak id weakSelf = self;
[client getPath:path parameters:nil success:^(id op, id response) {
    id strongSelf = weakSelf;
    if (strongSelf == nil) return;

    __weak id internalWeakSelf = strongSelf;
    [strongSelf.backgroundQueue_ addOperationWithBlock:^{
        id internalStrongSelf = internalWeakSelf;
        if (internalStrongSelf == nil) return;

        [internalStrongSelf doSomeHeavyComputation];                    

        __weak id internalInternalWeakSelf = internalStrongSelf;
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            id internalInternalStrongSelf = internalInternalWeakSelf;
            if (internalInternalStrongSelf == nil) return;

            [internalInternalStrongSelf reloadCollectionView];
        }];
    }];
}
failure:^(id op, NSError *error) {
    id strongSelf = weakSelf;
    if (strongSelf == nil) return;

    [strongSelf stopProgress];
    NSLog(@"Error fetching user data: %@", error);
}];
于 2012-09-18T05:32:37.073 に答える