2014-04-18 68 views
3

我目前正在使用UIDocument子類將我現有的應用程序從CoreData存儲重新設計爲基於文檔的應用程序。這主要是爲了能夠引入iCloud同步,因爲CoreData中的iCloud同步存在持續的問題。同步打開UIDocument

在某些地方,我可以很容易地用對應的UIDocument替換CoreData的使用,但是在某些地方,我真的很難用異步代碼替代同步代碼。主要是當我需要打開一些文件時,只需快速訪問,例如在計算過程中。

我已經實現了例如派遣小組,等待UIDocument行動,但在某些地方這似乎不合適。例如。當需要按順序打開大量文檔以完成計算時,這會導致塊和調度組非常複雜和怪異的鏈接。

爲了更好地理解這個問題,讓我大致描述一下文件的王我的應用程序使用:

每活躍用戶(不同的用戶可以登錄/註銷)每用戶
  • 一號文件
    • 一號文件+每年(應用程序可以顯示所選年)每年每用戶+
    • 多個數據文件
    • 這都可以加載到內存中只有一次,有的更多的元數據文件(這裏沒問題)

    因此,基本上,對於1個用戶和2年的應用使用情況,可以有大約50個文檔需要按需顯示並用於計算。

    用戶文檔將始終打開並加載到內存中,我在這裏看不到問題。對於其他文檔而言,它並不那麼容易,因爲我需要隨時加載它們,也可能是其他用戶的當前不活動的文檔(這消除了將當前用戶的所有文檔加載到內存中的可能性)。

    那麼,我的主要問題是,在處理大量文檔時會有什麼好的方法?

    我敢打賭,這是一個壞主意,只是加載所有文件到內存中,也就iCloud同步。

    是否有任何同步API或強制同步/同步API包裝的例子UIDocument

  • +0

    我不知道這是否會幫助,但繼承人[另一個問題](http://stackoverflow.com/q/10314190/2446155) –

    回答

    1

    你可以打開多個文檔同步迫使當前線程等待條件:

    - (void)openDocumentsSynchronously:(NSArray *)documents 
    { 
        __block NSUInteger waitingOnDocuments = documents.count; 
        NSCondition *condition = [NSCondition new]; 
    
        for (UIDocument *document in documents) 
        { 
         [document openWithCompletionHandler:^(BOOL success) { 
    
          waitingOnDocuments--; 
    
          [condition lock]; 
          [condition broadcast]; 
          [condition unlock]; 
         }]; 
        } 
    
        while (waitingOnDocuments > 0) 
        { 
         [condition lock]; 
         [condition wait]; 
         [condition unlock]; 
        } 
    } 
    

    我不建議在主線程這樣做,雖然,因爲這些文件可能需要一點同時打開。