0

現在、evernote api を使用して iOS でアプリを開発しています。マルチスレッドに関していくつか問題があります。以下は、私のアプリのマルチスレッド メカニズムです。良いですか、悪いですか? どんな提案も大歓迎です。

  1. MainThread(Thread a) を使用して、UI を表示および更新します。
  2. ユーザーが noteList ページにいるときに、Thread b を使用して evernote から noteList をダウンロードします。
  3. ユーザーが 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];
    }
}
4

1 に答える 1

0

Evernote NoteStore クラスはスレッドセーフではありません。複数の同時 Evernote API リクエストを行うために、複数の NoteStore オブジェクトを作成できます。

于 2012-03-31T20:12:14.153 に答える