1

MailCore フレームワーク (C ライブラリ LibEtPan に基づく) を使用してメール クライアントを開発しています。サーバー接続と新しいスレッドまたはキュー内のすべてのリクエストを処理し、UI の更新のために情報をメイン キューにプッシュしたいと考えています。

MailCore 変数をスレッド間で共有できないように見える問題。

@implementation Controller
{
    NSOperationQueue *_queue;
    CTCoreAccount *_account;
    CTCoreFolder *_inbox;
    NSArray *_messages;
}

- (id)init
{
   // stuff

    _queue = [[NSOperationQueue alloc] init];
    
    [_queue addOperationWithBlock:^
     {
         _account = [[CTCoreAccount alloc] init];
         
         BOOL success = [_account connectToServer:@"imap.mail.com" port:993 connectionType:CTConnectionTypeTLS authType:CTImapAuthTypePlain login:@"me@mail.com" password:@"Password"];
         
         if (success)
         {
             CTCoreFolder *inbox = [_account folderWithPath:@"INBOX"];
             NSArray *messages = [inbox messagesFromSequenceNumber:1 to:0 withFetchAttributes:CTFetchAttrEnvelope];
             
             [[NSOperationQueue mainQueue] addOperationWithBlock:^
              {
                  _messages = [messages copy];
                  // UI updates here
              }];
         }
     }];

     // Other stuff
}

後で、たとえば、このメソッドを呼び出すことができます:

- (void)foo
{
    [_queue addOperationWithBlock:^
     {
         CTCoreMessage *message = [_messages objectAtIndex:index];
         
         BOOL isHTML;
         NSString *body = [message bodyPreferringPlainText:&isHTML];
         
         [[NSOperationQueue mainQueue] addOperationWithBlock:^
          {
              // UI Updates
          }];
     }];
}

bodyCTCore 変数は からの新しいリクエストを実行できないため、は空_queueです。

このコメントによると、各スレッドには独自の CTCoreAccount などが必要です。iOS のスレッドは共有メモリを持っているはずです。LibetPan ライブラリで参照が使用されている場合でも、スレッド間で同じ CTCoreAccount を再利用できない理由がよくわかりません。複数回再利用できる別のスレッドまたはキューに「アタッチ」された一意の CTCoreAccount または CTCoreFolder を定義する方法は?

アドバイスをいただければ幸いです。ありがとうございました。

4

1 に答える 1

1

答えはここでMRongeによって与えられました。

1つの方法は、NSOperationQueue(maxConcurrentOperationCount = 1)とCTCoreAccountの両方を含むオブジェクトを作成することです。そのアカウントのすべての作業はオブジェクトを通過し、一度に1つのスレッドでのみ実行されます。次に、アクセスするアカウントごとにこれらのオブジェクトの1つを使用できます。

于 2012-11-25T11:49:52.977 に答える