2011-08-07 275 views
2

在我的AppDelegate中,我從互聯網上下載了一些數據並將其存儲到一個數組中。我想我的一個ViewController訪問該數組。我怎麼會這樣做呢?這是一個很好的情況來實現委託或協議?如果是這樣,有人可以推薦一個很好的教程嗎?在類之間傳遞對象

謝謝

編輯:

請注意在每次發射的數據刷新,所以沒有必要核心數據或Plist檔案。此外,數據是我創建的自定義對象,因此它們不能存儲在plist中。

+0

我認爲,答案取決於如果數據是不可變的,只裝載一次在啓動時(推到視圖 - 控制ONCE),或者如果數據是可變的,有興趣的視圖需要通知的變化(可觀測PUSH ),或者視圖控制器需要從數據對象中按需提取數據。 – JAL

+0

它真的很複雜,我認爲我們可以閱讀很多用戶試圖實現的內容以及他正試圖解決的問題,我只是讀取這些內容,因爲他試圖訪問他存儲在其應用程序代理中的數據。是的,設計選擇是有問題的,但純粹基於所提出的問題,其相當簡單。 「我如何從應用程序的任何位置訪問存儲在我的應用程序代理中的數據」 – Matt

回答

3

你有2種選擇:

  1. 實現一個委託協議
  2. 使用NSNotifications

每個的優缺點都很好地列出在這個問題和答案中: Delegates v Notifications

由於通知是更容易實施,而且可能已經足夠滿足您的需求,您可以通過以下步驟實現:

  1. 在課堂上,你下載的數據: 當數據被下載和陣列填充,包括下面的行:

NSDictionary *dict = [NSDictionary dictionaryWithObject:array forKey:@"Data"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"DataDownloaded" object:self userInfo:dict];

  • 在類要在其中接收數據:
  • 2.1以下行添加到您的viewDidLoad方法:

    `[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataDownloaded:) name:@"DataDownloaded" object:nil]; 
    

    2.2創建dataDownloaded選擇:

    • (無效)dataDownloaded:(NSNotification *)注意{

      NSDictionary *dict = note.userInfo; NSArray *dataArray = [note.userInfo objectForKey:@"DataDownloaded"];

    2.3添加以下行的dealloc和viewDidUnload:

    [[[NSNotificationCenter defaultCenter] removeObserver:self]; 
    
    +0

    我不認爲這真的回答了這個問題,但OP並沒有表明他知道數據何時有問題,但是如何從他的應用中的其他地方訪問它。我個人發現通知有點粗糙,但傾向於適合應用程序的非功能部分,例如可達性。一些更好的代碼設計可能會將數據封裝在通過工廠接口(保持可測試性)可用的專用類中作爲僞單元。 – Matt

    0

    您可以將數據存儲在plist文件中並將其用於所有視圖控制器。這樣,您不必擔心數據的大小(因爲您將按需加載並立即釋放它)。在你的其他觀點

    你必須寫:如果你想然後保存您的委託數組中,你必須創建委託的參考任何視圖,您可以在這樣的視圖訪問陣列

    +0

    問題是我的數據不是Foundation的一部分。這是我創建的一個自定義對象,哪個plists不能存儲。此外,我不需要使用核心數據作爲數據在每次啓動時刷新。 – darksky

    +0

    你可以存儲在plist文件或'檔案'中,而不使用/不知道coredata。你所需要做的就是使數據符合NSCoding協議。如果這是不可能的,我懷疑是否有任何優雅的方式,比維護全球數據和處理同步。 – Tatvamasi

    1

    在.h文件中

    #import "YourDelegateFile.h",並聲明varialble

    YourDelegateFile *appDelegate ; 
    

    在.m文件:

    - (void) viewDidLoad 
    { 
        appDelegate = (YourDelegateFile *)[UIApplication sharedApplication] delegate]; 
    
        NSArray *aArray = [appDelegate yourArrayName]; //yourArrayName is an array that you have declare in delegate 
    } 
    

    希望它可以幫助你。

    +0

    雖然這被認爲是好設計嗎?我已經多次聽說它根本不被推薦... – darksky

    +0

    它雖然回答了原來的海報問題,但這個代碼可能無法工作,具體取決於選擇器「yourArrayName」是什麼 – Matt

    0

    您只需訪問存儲在appdelegate中的數據。我不認爲這是問題的最佳解決方案,但爲了做的事情,你想要的方式。

    所以你申報財產在你的appdelegate .h文件中

    NSMutableArray* myArray_; 
    

    然後在.m文件屬性添加到同一個文件

    @property (nonatomic, retain) NSMutableArray* myArray; 
    

    確保您的合成物業

    @synthesize myArray = myArray_; 
    

    某處你的appdelegate .m文件,你會設置的值

    然後,在你的代碼的其他地方,你可以訪問屬性中的appdelegate像這樣

    MyAppDelegate *appDelegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate 
    NSMutableArray* localArray = appDelegate.myArray; 
    

    注意,良好的封裝應該要使用一個NSArray但我用可變保持代碼的短。

    此外,使用的appdelegate作爲節目數據的全局存儲是不是一個好主意,它打破了很多的規則,你不應該打破,單一職責原則是一個好的開始。理論上,應該是在一個專用的存儲類應用程序數據,也許是單身或更好的可測試性由一個工廠類服務的一個實例類。這樣,你的數據是從已知的良好定義的實體訪問,它是可測試的,它表彰優秀的設計原則

    +0

    在我的情況下,你會只是推薦單身課程?基本上我有一個10個頻道的名單。對於每個頻道,我需要存儲三件事情:現在,接下來和以後。那麼像單個類中的兩個嵌入式NSDictionaries就可以做到這一點?請注意我也在談論優秀的設計。良好的設計對我來說與功能一樣重要。 – darksky

    +0

    單身人士是有爭議的看到這篇文章http://www.ibm.com/developerworks/webservices/library/co-single/index.html他們確實有自己的位置,但他們打破了很多良好的做法,如單一責任原則,他們負責提供給您的應用程序的功能以及管理只有一個實例的事實,他們也使測試變得困難。有一些更精細的方法可以更好地利用工廠來管理單件事情。一本完整的書可以專注於這個主題,身份證建議閱讀有關它.. – Matt

    +0

    個人,它聽起來像是唯一的區別現在,接下來是你看這些數據的時間,雖然這使得假設你如何請求數據以及它如何返回。爲什麼不把頻道建模成它負責瞭解它的節目的對象,然後有一些操作來確定哪一個是現在,將來或稍後,你可能需要一個包含頻道對象的channelManager類,你也可能發現它有助於將請求作爲一個對象進行建模,並圍繞該請求建立一些代碼,以便發出請求並處理響應由你決定 – Matt

    0

    您可以發送通知,如果應用程序委託了新的數據和所有相關的控制器都知道,他們需要更新的觀點。爲此,您可以使用NSNotificationCenter。例如

    - (void)newDataLoaded { 
        NSDictionary *userInfo = [NSDictionary dictionaryWithObject:arrayOfData forKey:@"data"]; 
        [[NSNotificationCenter defaultCenter] postNotificationName:@"data updated notification name" object:nil userInfo:userInfo]; 
    } 
    

    如果某些控制器感興趣的數據更新它應該儘快認購該通知越好:

    - (void)viewDidLoad { 
        ... 
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataUpdatedNotificationHandler:) name:@"data updated notification name" object:nil]; 
        ... 
    } 
    

    不要忘記從通知退訂,如果你不需要它。在viewDidUnloaddealloc方法中使用[[NSNotificationCenter defautCenter] removeObserver:self]

    - (void)dataUpdatedNotificationHandler:(NSNotification*)notification { 
        NSArray *data = [[notification userInfo] objectForKey:@"data"]; 
        // update your view here 
    }