gpt4 book ai didi

objective-c - MailCore 并发支持

转载 作者:行者123 更新时间:2023-11-29 13:24:51 25 4
gpt4 key购买 nike

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

如有任何建议,我们将不胜感激。谢谢。

最佳答案

MRonge给出了答案here .

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.

关于objective-c - MailCore 并发支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13421602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com