質問は簡単です:起動するたびにアップデートがあれば、私のappコントロール。更新がある場合、ポップアップが表示され、[はい]または[いいえ]が選択されます。ユーザーが「はい」をタップすると4つのメソッドが起動しますこれらのメソッドは、XMLファイルをダウンロードし、CoreDataをアップロードします。これは、アラートのコードです:iOS - バックグラウンドプロセスとUIアップデート
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex==1) {
[self showActivityViewer];
[self downloadControlAndUpdatePoi];
[self downloadControlAndUpdateItinerari];
[self downloadControlAndUpdateArtisti];
[self downloadControlAndUpdateEventi];
[self hideActivityViewer];
NSLog(@"AGGIORNA");
} else {
NSLog(@"NON AGGIORNARE");
return;
}
}
しかし、問題があります:ユーザータップはいアラートが消え、すべてのメソッドが終了するまで画面に残りません。私はスタートをタップしますが、アクティビティビューアは表示されません。
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex==1) {
[self showActivityViewer];
[NSThread detachNewThreadSelector:@selector(startDownloads) toTarget:self withObject:nil];
[self hideActivityViewer];
NSLog(@"AGGIORNA");
} else {
NSLog(@"NON AGGIORNARE");
return;
}
}
-(void)startDownloads {
NSInvocationOperation *opPoi=[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadControlAndUpdatePoi) object:nil];
NSInvocationOperation *opItinerari=[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadControlAndUpdateItinerari) object:nil];
NSInvocationOperation *opArtisti=[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadControlAndUpdateArtisti) object:nil];
NSInvocationOperation *opEventi=[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadControlAndUpdateEventi) object:nil];
NSArray *operations=[[NSArray alloc] initWithObjects:opPoi,opItinerari,opArtisti,opEventi, nil];
NSOperationQueue *queue=[[NSOperationQueue alloc] init];
[queue addOperations:operations waitUntilFinished:YES];
[queue waitUntilAllOperationsAreFinished];
}
も、ここでの問題があります。だから私は、この他のコードを試してみてください。アラートが消え、スレッドが次々に4つの方法を開始して実行します。
2番目のコードと同じようにバックグラウンドで実行するプロセスが必要ですが、showActityViewerメソッドを実行してスピナーを表示する必要があります。
ありがとうございました:)
私はどのようにstartDownloadsを呼び出す必要がありますか?ユーザーが「はい」をタップした後、NSThreadのデタッチまたは[self startDownloads]を使用しますか? –
申し訳ありませんが、detachThread;あなたはこれを正しくやっています。唯一のポイントは、startDownloadsでより多くの非同期操作を必要としないことです。 – sergio
これは問題ありませんが、大きな問題が発生しました。私のdownloadAndControl *メソッドはCoreDataで動作します。このソリューションでは、CoreDataのメソッドsaveでNSInternalInconsistencyExceptionが発生します。 –