2015-09-20 4 views
0

В моем приложении, когда пользователь запустил приложение, я создаю экземпляр класса в своем AppDelegate и вызываю метод в классе, который сравнивает все контакты iOS пользователя с найти те, которые используют мое приложение, и помещает эти контакты в NSMutableArrayObjective-C: сохранение переменной в другом классе

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
... 
GetContactClass *contact = [[GetContactClass alloc] init]; 
[contact getAllContacts]; 
... 
} 

GetContactClass.h

@property (retain, nonatomic) NSMutableArray *appContacts; 

В конце метода getAllContacts я NSLog из appContacts, и он отлично работает.

Однако позже в приложении я пытаюсь установить NSMutableArray в ViewController равным appContacts, но я получаю (нулевой) массив.

ViewController.m

self.searchableContacts = [[NSMutableArray alloc] init]; 

GetContactClass *contact = [[GetContactClass alloc] init]; 
self.searchableContacts = contact.appContacts; 

Что я здесь делаю неправильно?

ответ

2

Вы создаете совершенно новый экземпляр, который не запрашивался для сбора всех контактов, поэтому он не сохранил их. По внешнему виду кода экземпляр, который их сохранил, был уничтожен. Поскольку вы используете это в основном потоке, вы можете просто попросить новый экземпляр получить контакты и удалить код для старого. Однако лучше запустить коллекцию контактов в фоновом потоке и сохранить результат, пока он вам не понадобится, в переменной сохраненного экземпляра.

0

Если вы хотите использовать эти данные во всех приложения вы должны использовать шаблон проектирования Singleton: В Objective-C:

@implementation Settings 
+ (id)sharedInstance { 
    static Settings *sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[self alloc] init]; 
    }); 
    return sharedInstance; 
} 

Другой способ изменения сохранить в сильной, но это плохая идея, и поставить это свойство в appDelegate и вызвать все время APPDelegate получить свойство.

Смежные вопросы