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
          }];
     }];
}

这里,body是空的,因为 CTCore 变量无法执行来自_queue.

根据此评论,每个线程需要自己的 CTCoreAccount 等...... iOS 上的线程应该具有共享内存。我不完全理解为什么跨线程重用相同的 CTCoreAccount 不起作用,即使在 LibetPan 库中使用了引用。如何定义一个唯一的 CTCoreAccount 或 CTCoreFolder “附加”到可以多次重用的不同线程或队列?

任何建议将不胜感激。谢谢你。

4

1 回答 1

1

MRonge在这里给出了答案。

One way is to create an object that contains both the NSOperationQueue (with the maxConcurrentOperationCount=1) and the CTCoreAccount. All work for that account goes through the object, and is only executed on one thread at a time. Then you can one of these objects for each account you want to access.

于 2012-11-25T11:49:52.977 回答