MailCore并发支持

时间:2012-11-16 17:34:13

标签: objective-c ios multithreading nsoperationqueue mailcore

我正在使用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的新请求。

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

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

1 个答案:

答案 0 :(得分:1)

MRonge here给出了答案。

  

一种方法是创建一个包含NSOperationQueue的对象   (使用maxConcurrentOperationCount = 1)和CTCoreAccount。所有   该帐户的工作遍历该对象,并且仅在该帐户上执行   一次一个线程。然后你可以为每个对象中的一个   您想要访问的帐户。

相关问题