4

iOSでJSON解析を行っていて、スピナーを追加したかったのですが、これは問題なく機能しますが、スピナーを停止できません。その理由を理解したいと思います。

[spinner stopAnimating]は非同期ブロックで呼び出され、問題が発生していると思います。おそらく、ブロック内のスピナーでメソッドを呼び出せないためですか?スピナーobjをログに記録しましたが、出力は次のとおりです。

<UIActivityIndicatorView: 0x76905f0; frame = (150 230; 20 20); layer = <CALayer: 0x768ffb0>>

たぶん誰かが私にobjective-cでこの非同期メソッドを扱う方法を理解させることができます。私は全くの初心者です。

コード:

- (void)viewDidLoad{
  [super viewDidLoad];

  UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
  spinner.center = CGPointMake(160, 240);
  [self.view addSubview:spinner];
  [spinner startAnimating];


  dispatch_async(kBgQueue, ^{

    NSData* data = [NSData dataWithContentsOfURL:
                    kLatestKivaLoansURL];
    [self performSelectorOnMainThread:@selector(fetchedData:)
                           withObject:data waitUntilDone:YES];
     NSLog(@"loans: %@", spinner);
     [spinner stopAnimating];
  });


}
4

3 に答える 3

8

バックグラウンド スレッドでインターフェイスと対話することは決してありません (決してありません!)。あなたが望むのは、メイン スレッドに戻ることです。簡単です。

[spinner startAnimating];
dispatch_async(kBgQueue, ^{
    NSData* data = [NSData dataWithContentsOfURL:
                    kLatestKivaLoansURL];
    // ... do other stuff in the background
    dispatch_async(dispatch_get_main_queue(), ^{
        [spinner stopAnimating];
    });
});

ただし、バックグラウンド スレッドをブロックしてはならないため、performSelectorOnMainThread:withObject:waitUntilDone:withの使用waitUntilDone:YESも間違っています (または、少なくとも非常に悪臭がします)。ここでバックグラウンド スレッドでメソッドを呼び出すだけで (インターフェイスに触れない限り)、結果が返ってきたら返されます。

于 2013-01-26T16:02:27.067 に答える
1

stopAnimatingの後にメソッドremoveFromSuperviewも呼び出します

    [spinner stopAnimating];
    [spinner removeFromSuperview];
于 2013-01-26T15:55:52.687 に答える
0

UIKit 呼び出しは、メイン スレッドでのみ行うことができます。これを試して:

dispatch_async(kBgQueue, ^{

     NSData* data = [NSData dataWithContentsOfURL:kLatestKivaLoansURL];
    [self performSelectorOnMainThread:@selector(fetchedData:)
                       withObject:data waitUntilDone:YES];
     NSLog(@"loans: %@", spinner);

     dispatch_async(dispatch_get_main_queue(), ^{

         [spinner stopAnimating];

     });
});
于 2013-01-26T16:13:58.567 に答える