アプリがビジーであることを示すカスタムの方法として、アニメーション化された UIImageView を表示するアプリを作成しています。ファイルのアップロードに NSOperationQueue を使用しています。キューに何かがあるときに UIImageView を表示したいと思います。キュー内のすべての操作が完了したら、UIImageView を削除したいと考えています。
これは本当に簡単にできることだと思っていましたが、ここ 1 時間行き詰まっています。UIImageView を表示するのはとても簡単ですが、削除できないようです。おそらく、私が見落としているのは本当に単純なことです。これが私のコードです。ありがとうございました!:)
- (void)viewDidLoad {
//set up the uiimageview
self.spinnerView = [[UIImageView alloc] initWithFrame:CGRectMake([[UIScreen mainScreen] bounds].size.width-44,0,44,44)];
self.spinnerView.animationImages = [NSArray arrayWithObjects:
[UIImage imageNamed:@"0.gif"],
[UIImage imageNamed:@"1.gif"],
[UIImage imageNamed:@"2.gif"],
[UIImage imageNamed:@"3.gif"],
[UIImage imageNamed:@"4.gif"], nil];
self.spinnerView.animationDuration = 0.5f;
self.spinnerView.tag = 998;
self.spinnerView.animationRepeatCount = 0;
[self.view addSubview: self.spinnerView];
//set up the queue
self.uploadQueue = [[NSOperationQueue alloc] init];
[self.uploadQueue setMaxConcurrentOperationCount:1];
//set up observer for the queue
[self.uploadQueue addObserver:self forKeyPath:@"operationCount" options:NSKeyValueObservingOptionNew context:NULL];
}
- (void)newUpload:(NSData*)data {
[self.spinnerView startAnimating];
//....
//request is a NSURLRequest that's set up in this method
[NSURLConnection sendAsynchronousRequest:request queue:self.uploadQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
}];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context
{
if (object == self.uploadQueue && [keyPath isEqualToString:@"operationCount"]) {
if (self.uploadQueue.operationCount == 0) {
[self.spinnerView stopAnimating];
}
}
else {
[super observeValueForKeyPath:keyPath ofObject:object
change:change context:context];
}
私はこれを正しくやっていますか?それを行うより良い方法はありますか?私はしばらくここで立ち往生しており、おそらくUIImageViewが台無しになっているのではなく、NSOperationQueueにNSURLRequestsを追加する方法であると考え始めています。
再度、感謝します!