I am trying to create mail client, I have very simple GUI in my app:
- Login button
- Email placeholder
- Password placeholder
I use MailCore2 library to fetch messages and etc. And in one moment I suppose that it is very good idea to pass data from my ViewController to my TableViewController. So, I fetch my messages in my first ViewController and pass this array to my second TableViewController, thats how I doing this:
- (IBAction)loginButtonPressed:(id)sender {
myTableViewController = [[MyTableViewController alloc] initWithNibName:@"MyTableViewController" bundle:nil];
[self makeSession:@"[email protected]" withPassword:@"mypassword"];
[self performSegueWithIdentifier:@"Inbox" sender:self];
}
And my "makeSession" method:
- (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)"
}
As you can see, I am using my inVar from 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
And my TableViewController's interface file:
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface MyTableViewController : UITableViewController
{
__block NSArray *messages;
}
@property NSArray *messages;
@end
NS_ASSUME_NONNULL_END
NSLog shows me "null" if I try to use it outside block, however, my variable self->myTableViewController.messages has data, but only inside block.
UPDATE: I tried something like this, but I get infinite loop...
__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);