Я пытаюсь создать почтовый клиент, у меня очень простое GUI в моем приложении:
- кнопка входа
- заполнитель электронной почты
- заполнитель пароля
Я использую библиотеку MailCore2 для извлечения сообщений и т. Д. c. И в какой-то момент я предполагаю, что это очень хорошая идея - передать данные из моего ViewController в мой TableViewController. Итак, я получаю свои сообщения в моем первом ViewController и передаю этот массив моему второму TableViewController, вот как я это делаю:
- (IBAction)loginButtonPressed:(id)sender {
myTableViewController = [[MyTableViewController alloc] initWithNibName:@"MyTableViewController" bundle:nil];
[self makeSession:@"zurgsrushmber@gmail.com" withPassword:@"mypassword"];
[self performSegueWithIdentifier:@"Inbox" sender:self];
}
И мой метод "makeSession":
- (void)makeSession:(NSString *)email withPassword:(NSString *)password {
MCOIMAPSession *session = [[MCOIMAPSession alloc] init];
[session setHostname:@"imap.gmail.com"];
[session setPort:993];
[session setUsername:email];
[session setPassword:password];
[session setConnectionType:MCOConnectionTypeTLS];
MCOIMAPMessagesRequestKind requestKind = MCOIMAPMessagesRequestKindHeaders;
NSString *folder = @"INBOX";
MCOIndexSet *uids = [MCOIndexSet indexSetWithRange:MCORangeMake(1, UINT64_MAX)];
MCOIMAPFetchMessagesOperation *fetchOperation = [session fetchMessagesOperationWithFolder:folder requestKind:requestKind uids:uids];
[fetchOperation start:^(NSError * _Nullable error, NSArray * _Nullable fetchMessages, MCOIndexSet * _Nullable vanishedMessages) {
if (error) {
NSLog(@"Error downloading message headers:%@", error);
} else {
// NSLog(@"The post man delivereth:%@", fetchMessages);
self->myTableViewController.messages = [[NSArray alloc] initWithArray:fetchMessages];
}
}];
NSLog(@"The post man delivereth:%@", myTableViewController.messages); // Displays "The post man delivereth:(null)"
}
Как вы можете видеть, я использую свой inVar из ViewController.h:
#import <UIKit/UIKit.h>
#import <MailCore/MailCore.h>
#import "MyTableViewController.h"
@interface ViewController : UIViewController
{
__block MyTableViewController *myTableViewController;
}
@property (weak, nonatomic) IBOutlet UITextField *emailTextField;
@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;
@end
И файл интерфейса моего TableViewController:
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface MyTableViewController : UITableViewController
{
__block NSArray *messages;
}
@property NSArray *messages;
@end
NS_ASSUME_NONNULL_END
NSLog показывает мне «ноль», если я пытаюсь использовать это вне блока, однако, моя переменная self-> myTableViewController.messages содержит данные, но только внутри блока.
UPDATE: Я пробовал что-то подобное, но получаю бесконечный l oop ...
__block BOOL finished = NO;
[fetchOperation start:^(NSError * _Nullable error, NSArray * _Nullable fetchMessages, MCOIndexSet * _Nullable vanishedMessages) {
if (error) {
NSLog(@"Error downloading message headers:%@", error);
} else {
self->myTableViewController.messages = [[NSArray alloc] initWithArray:fetchMessages];
// NSLog(@"The post man delivereth:%@", self->myTableViewController.messages);
finished = YES;
}
}];
while (!finished);
NSLog(@"The post man delivereth:%@", self->myTableViewController.messages);