2011-08-20 64 views
4

我有一個應用程序,當主主屏幕加載時,我檢查背景中的同步更新。如果連接速度緩慢或用戶在應用程序中快速移動,則會有一堆請求可能會在後臺堆疊起來。爲了防止這種情況,我想實現一個BOOL變量,我切換YES或NO來防止多個請求出去檢查同步。使用NSUserDefaults作爲一種全局實例變量是一個壞主意?

因此,當一個請求開始了我的代碼將是這樣的:

NSUserDefaults *d = [NSUserDefaults standardUserDefaults]; 
NSString *key = [NSString stringWithFormat:kVarAllowSyncRequest, aManufacturerID]; 
[d setBool:NO forKey:key]; 

我知道這會工作,但這樣將我的應用程序的使用過程中被調用的時候100的 - 是的東西我甚至需要擔心?

有沒有更好的方法來做到這一點?

回答

3

用戶默認值是一個很好的地方,可以將首選項和信息不會更改,或者每次會話需要訪問超過兩次或三次。訪問默認值意味着點擊緩慢的磁盤;你不想將它用於每分鐘多次檢查一次標誌等。

的應用程序委託是存儲真正需要是在應用程序中許多對象訪問信息的方便的地方,因爲它總是通過[[UIApplication sharedApplication] delegate]訪問,但你應該仔細考慮您的應用程序設計的稱重該對象來與前只是因爲它看起來很方便而有很多ivars。

大概只有一個對象,可能是一個視圖控制器,它負責發送這些請求。那是放旗的地方。從你的描述來看,它聽起來並不像你需要一個應用程序全局變量。該標誌僅由發起請求的對象使用,因此它是唯一需要了解它的對象。國旗可以是伊娃。

如果實際上你有一個,它可能有許多實例會發出一個請求,那麼正確的解決方案應該是有一個任何實例都有權訪問的類級標誌。這很簡單。在實現文件中,聲明一個變量來保存標誌:

// RequestMaker.m 

#import "RequestMaker.h" 

static BOOL allowSyncRequest = YES; 

@implementation RequestMaker 
// etc. 

它宣佈static,使其只在這個「編譯單元」可見(鬆散,在這個文件)。

然後創建一個類的方法各設置和獲得此標誌:

+ (BOOL) allowSyncRequest { 
    return allowSyncRequest; 
} 

+ (void) setAllowSyncRequest: (BOOL)b { 
    allowSyncRequest = b; 
} 

現在,每次你RequestMaker實例中的一個要開始的請求時,它應該檢查該標誌;如果是YES,那麼您可以關閉標誌並開始請求。當請求結束時,您還需要確保重置該標誌。

(這一切都假定你沒有明確的工作對你的要求不同線程。如果你,那麼你應該看看GCD queues也許信號燈。有一個很好的一套writeups by Mike Ash,讓你開心閱讀甚至不想使用GCD。)

0

NSUserDefaults應該用於保存一般不經常改變的值。

對全局變量實現解決方案最簡單的方法是將屬性添加到已經可用的單例類 - 您的應用程序委託!這裏的代碼,我通常在視圖控制器使用需要經常訪問應用程序的委託:

​​

然後,假設你有你的應用程序代理的allowSyncRequest屬性,您可以從您的視圖控制器訪問這樣說:

self.appDelegate.allowSyncRequest = NO; 
相關問題