MailCore 并发支持

Posted

技术标签:

【中文标题】MailCore 并发支持【英文标题】:MailCore concurrency support 【发布时间】:2012-11-05 11:22:58 【问题描述】:

我正在使用 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 “附加”到可以多次重用的不同线程或队列?

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

【问题讨论】:

关键字是coredata和addressbook也使用的thread contains 感谢您的信息。我会检查的。 除了 CoreData 上下文管理之外,没有其他关于线程包含的细节。我在这里没有使用 CoreData。基本上,我想要的只是在同一个 NSOperationQueue 的不同 NSOperation 之间共享同一个对象。 并且考虑到 NSOperationQueue 可以被序列化。 我是说 MailCore 采用与 CD 相同的技术。 【参考方案1】:

MRongehere已经给出了答案。

一种方法是创建一个包含 NSOperationQueue 的对象 (maxConcurrentOperationCount=1)和 CTCoreAccount。全部 该帐户的工作通过对象,并且仅在 一次一个线程。然后你可以为每个对象之一 您要访问的帐户。

【讨论】:

以上是关于MailCore 并发支持的主要内容,如果未能解决你的问题,请参考以下文章

tomcat 最多支持并发多少用户?

ruoyi能支持多大并发

tomcat支持多少并发

tomcat服务nio 支持多大并发

并发症系列支持 - 如果不支持,则不显示并发症系列

[转]TOMCAT 可以稳定支持的最大并发用户数