現在、evernote api を使用して iOS でアプリを開発しています。マルチスレッドに関していくつか問題があります。以下は、私のアプリのマルチスレッド メカニズムです。良いですか、悪いですか? どんな提案も大歓迎です。
- MainThread(Thread a) を使用して、UI を表示および更新します。
- ユーザーが noteList ページにいるときに、Thread b を使用して evernote から noteList をダウンロードします。
- ユーザーが noteDetail ページにいるときに、Thread c を使用して evernote から noteResource をダウンロードします。
スレッド b が終了していないときに、ユーザーが noteList ページで 1 つのメモをクリックした場合。スレッド c を使用して noteResource をダウンロードする前に、スレッド b をキャンセルする必要がありますか? または、スレッド b とスレッド c の両方を同時に実行しても安全ですか?
これに関する文書や授業料はありますか?
以下にコードを追加しました。よろしいですか?ユーザーが最初にログインすると、masterSync が実行され、メモのタイトルがダウンロードされて表示されます。この後、ユーザーが同期ボタンを押すと、再び masterSync が実行されるのですが、noteStore の alloc/init 時に authResult の authenticationToken にアクセスした時点でクラッシュし、ユーザーのログインが成功したときに authResult を保存しましたよね?
-(void)sync:(id)obj {
NSOperationQueue *operationQueue = [AppDelegate sharedOperationQueue];
if ([obj isKindOfClass:[Note class]]) {
self.detailSync = [[[EvernoteDetailSync alloc] initWithNote:obj] autorelease];
detailSync.noteStore =[[[EvernoteNoteStore alloc] initWithToken:[authResult authenticationToken] shardId:[[authResult user] shardId]] autorelease];
[operationQueue addOperation:detailSync];
} else {
self.masterSync = [[[EvernoteMasterSync alloc] initWithNotebookGuid:obj] autorelease];
masterSync.noteStore =[[[EvernoteNoteStore alloc] initWithToken:[authResult authenticationToken] shardId:[[authResult user] shardId]] autorelease];
[operationQueue addOperation:masterSync];
}
}