我正在使用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:@"[email protected]" 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上的线程应该具有共享内存。我不完全理解为什么即使在LibetPan库中使用了引用,在线程之间重用相同的CTCoreAccount也不起作用。
如何定义“附加”到可以重复使用多次的不同线程或队列的唯一CTCoreAccount或CTCoreFolder?
任何建议将不胜感激。谢谢。
最佳答案
答案由MRonge here给出。
一种方法是创建一个同时包含NSOperationQueue的对象
(maxConcurrentOperationCount = 1)和CTCoreAccount。所有
该帐户的工作会遍历对象,并且仅在
一次一个线程。然后,您可以为每个对象使用这些对象之一
您要访问的帐户。