2010-12-04 58 views
1

問候集體對象設計,幫助與UIScrollView中的異步人口

我新的可可和一直負責對iPhone和iPad上運行4.2原型應用程序工作。我在設計一個將數據回填到我用來填充UIScrollView的自定義對象的過程時遇到了問題。每個自定義對象顯示電影數據(藝術品,演員等),並從REST服務調用此數據。

我希望這個Movie對象負責它的渲染,因此將它的數據需要傳遞給一個單獨的對象,這個對象可以執行實際的REST調用,JSON解析等。我一直在試圖包裹我的頭圍繞使用代表或NSOperation或直接回調來提供解決方案,但我無法辨別要追求哪條途徑。

我知道我需要在後臺處理該數據,以保持UI活在主線程,但我如何來設計這些對象之間的連接掙扎:目前,我

TheaterViewController //ViewController that contains the UIScrollView 

填充TheaterViewController的UIScrollView中有11個(任意分配)MovieView項目 - MovieView顯示了ActivityIndi​​cator讓用戶知道它的工作對提供內容

MovieItem //a single movie and it's respective data 

MovieView //individual View that displays a single MovieItem content 

DataAgent //background-capable object that fetches data from app server 

DataWarehouse //Singleton-designed class that maintains an NSMutableArray of MovieItem's 

在我目前的設計中,TheaterViewController填充的UIScrollView w^ith 11個MovieView的。然後每個MovieView都會獲取它自己的數據。我知道如何讓DataAgent檢查DataWarehouse的內容,如果不存在,請致電REST服務。我不知道該怎麼做,是通知/回調/張貼到MovieView DataAgent已完成獲取數據(最好以異步方式),以便它可以呈現它的完整視圖。

任何人都可以指向一個文檔,或者做這種異步回調過程的例子嗎?

在此先感謝您的好鄉親拿出任何指針 -

回答

0

代表團肯定是遵循一個很好的途徑。我會製作一個DataAgentDelegate協議,其中包含一個名爲-(void)dataFetchComplete之類的@required方法。這將全部實現如下:

在DataAgent.h

@interface DataAgent : NSObject { 
    id<DataAgentDelegate> delegate; 
} 

@property (nonatomic, retain) id<DataAgentDelegate> delegate; 

在DataAgent.m

- (void) fetchingComplete { 
    if (delegate != nil) { 
     [delegate dataFetchComplete]; 
    } 
} 

在MovieView.h

@interface MovieView : NSObject <DataAgentDelegate> { 
    //... 
} 

在MovieView.m

- (void) startDataFetch { 
    DataAgent *dataAgent = [[DataAgent alloc] init]; 
    dataAgent.delegate = self; 
    [dataAgent startFetching]; 
} 


- (void) dataFetchComplete { 
    //render fetched assets in view 
} 

我想不出任何具體的示例程序,但這是一件很常見的事情。在處理異步事件時,委派非常方便。我希望這有幫助!

+0

阿爾曼 - 感謝您的回覆。我將把這個解決方案插入我的源代碼並查看它是如何擺脫的。我也在使用dispatch_get_global_queue()來看看基於GCD的解決方案。 – 2010-12-05 10:11:33