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 のスレッドは共有メモリを持っているはずです。LibetPan ライブラリで参照が使用されている場合でも、スレッド間で同じ CTCoreAccount を再利用できない理由がよくわかりません。複数回再利用できる別のスレッドまたはキューに「アタッチ」された一意の CTCoreAccount または CTCoreFolder を定義する方法は?
アドバイスをいただければ幸いです。ありがとうございました。