How to pass data from block in one view controller to another

88 Views Asked by At

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);
0

There are 0 best solutions below