天天看點

IOS通過NSUserDefaults實作簡單的應用間資料傳遞

nsuserdefaults是用于儲存應用程式設定,應用資訊等輕量級資料的的一個類,其本質是将資料寫為plist檔案的形式儲存在本地。在ios中,系統為每一個應用程式都預設建立了一個nsuserdefaults對象。

+ (nsuserdefaults *)standarduserdefaults;

擷取系統預設建立的應用程式設定表

+ (void)resetstandarduserdefaults;

這個方法用于将記憶體中存儲的資料寫入磁盤,當nsuserdefaults的資料表改變的時候,系統不會立刻将其同步到磁盤,而是隔一段時間進行同步,我們可以手動調用這個方法進行同步。

- (instancetype)initwithsuitename:(nsstring *)suitename;

這個方法建立一個新的域:根據名字可以建立一些不同的域,分别存儲幾套設定資訊。

- (id)objectforkey:(nsstring *)defaultname;

- (void)setobject:(id)value forkey:(nsstring *)defaultname;

- (void)removeobjectforkey:(nsstring *)defaultname;

上面三個方法是對對象存儲進行的操作,分别是存儲,擷取和删除。

- (nsstring *)stringforkey:(nsstring *)defaultname;

擷取字元串資料

- (nsarray *)arrayforkey:(nsstring *)defaultname;

擷取數組資料

- (nsdictionary *)dictionaryforkey:(nsstring *)defaultname;

擷取字典資料

- (nsdata *)dataforkey:(nsstring *)defaultname;

擷取data資料

- (nsarray *)stringarrayforkey:(nsstring *)defaultname;

擷取字元串數組資料

- (nsinteger)integerforkey:(nsstring *)defaultname;

擷取整型資料

- (float)floatforkey:(nsstring *)defaultname;

擷取浮點型資料

- (double)doubleforkey:(nsstring *)defaultname;

擷取雙精度浮點型資料

- (bool)boolforkey:(nsstring *)defaultname;

擷取布爾詩句

- (nsurl *)urlforkey:(nsstring *)defaultname;

擷取網址資料

下面是一些對應的set方法

- (void)setinteger:(nsinteger)value forkey:(nsstring *)defaultname;

- (void)setfloat:(float)value forkey:(nsstring *)defaultname;

- (void)setdouble:(double)value forkey:(nsstring *)defaultname;

- (void)setbool:(bool)value forkey:(nsstring *)defaultname;

- (void)seturl:(nsurl *)url forkey:(nsstring *)defaultname;

- (void)registerdefaults:(nsdictionary *)registrationdictionary;

這個方法可以通過字典對資料表進行指派

- (void)addsuitenamed:(nsstring *)suitename;

添加一個域

- (void)removesuitenamed:(nsstring *)suitename;

移除一個域

- (nsdictionary *)dictionaryrepresentation;

傳回系統設定的資訊,也是nsglobaldomain域中的資訊。

@property (readonly, copy) nsarray *volatiledomainnames;

傳回一個數組,其中是所有不穩定域的名字

- (nsdictionary *)volatiledomainforname:(nsstring *)domainname;

根據名字擷取不穩定域中的資料

- (void)setvolatiledomain:(nsdictionary *)domain forname:(nsstring *)domainname;

根據名字設定不穩定域

- (void)removevolatiledomainforname:(nsstring *)domainname;

根據名字移除不穩定域

- (nsdictionary *)persistentdomainforname:(nsstring *)domainname;

根據名字擷取穩定域的資料

- (void)setpersistentdomain:(nsdictionary *)domain forname:(nsstring *)domainname;

根據名字設定穩定域

- (void)removepersistentdomainforname:(nsstring *)domainname;

根據名字移除穩定域

- (bool)synchronize;

對象的同步方法,将記憶體中的資料寫入磁盤。

- (bool)objectisforcedforkey:(nsstring *)key;

判斷某個鍵值的資料是否存在

- (bool)objectisforcedforkey:(nsstring *)key indomain:(nsstring *)domain;

判斷某個域中某個鍵值的資料是否存在

我們應該了解到,在ios中,因為沙盒模式的存在,應用間是不允許互相通路資料與傳值通信的。這樣做的好處顯而易見:

1、保證了資料的安全性

2、資料的管理更加簡潔

3、當我們删除資料時,隻需要将沙盒删除。

在某些需求下,我們可能會需要應用程式間的傳值與通信,當然除了通過網絡外,對于非常小的資料量,比如驗證另一應用從程式是否登入,是否安裝并且開啟過一次,我們也可以通過nsuserdefaults的一個全局的資料表來實作。

nsuserdefaults的三個特殊的系統域如下:

nsstring * const nsglobaldomain;

這個是一個系統級别的全局的域,存儲這系統配置資訊,我們可以通過它實作應用程式間傳值

nsstring * const nsargumentdomain;

這個是在本應用程式内可通路的域,存儲着應用程式的資訊

nsstring * const nsregistrationdomain;

這個是存放臨時資料的域

代碼示例如下:

首先在第一個工程中,我們寫如下代碼運運作一下:

<a href="http://my.oschina.net/u/2340880/blog/411344#">?</a>

1

2

3

4

5

6

7

8

9

<code>    </code><code>//擷取全局的域</code>

<code>    </code><code>nsdictionary * dic = [[nsuserdefaults standarduserdefaults]persistentdomainforname:nsglobaldomain];</code>

<code>    </code><code>nsmutabledictionary * temdic = [nsmutabledictionary dictionarywithdictionary:dic];</code>

<code>    </code><code>[temdic setobject:@</code><code>"傳遞的值"</code> <code>forkey:@</code><code>"應用1"</code><code>];</code>

<code>    </code><code>//重設</code>

<code>    </code><code>[[nsuserdefaults standarduserdefaults]setpersistentdomain:temdic forname:nsglobaldomain];</code>

<code>    </code><code>//同步</code>

<code>    </code><code>[nsuserdefaults resetstandarduserdefaults];</code>

<code>    </code><code>nslog(@</code><code>"%@"</code><code>,dic);</code>

列印的結果是許多系統資訊。

在第二個工程中,我們這樣做:

<code> </code><code>nsdictionary * dic = [[nsuserdefaults standarduserdefaults]persistentdomainforname:nsglobaldomain];</code>

<code>    </code><code>nslog(@</code><code>"%@\n--------------\n%@=%@"</code><code>,dic,@</code><code>"應用1"</code><code>,[dic objectforkey:@</code><code>"應用1"</code><code>]);</code>

結果如下:

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

<code>2015-05-06 15:48:49.897 321[4100:186745] {</code>

<code>    </code><code>appleitunesstoreitemkinds =     (</code>

<code>        </code><code>newsstand,</code>

<code>        </code><code>podcast,</code>

<code>        </code><code>"itunes-u"</code><code>,</code>

<code>        </code><code>artist,</code>

<code>        </code><code>booklet,</code>

<code>        </code><code>document,</code>

<code>        </code><code>ebook,</code>

<code>        </code><code>software,</code>

<code>        </code><code>"software-update"</code><code>,</code>

<code>        </code><code>"podcast-episode"</code>

<code>    </code><code>);</code>

<code>    </code><code>applelanguages =     (</code>

<code>        </code><code>en,</code>

<code>        </code><code>fr,</code>

<code>        </code><code>de,</code>

<code>        </code><code>"zh-hans"</code><code>,</code>

<code>        </code><code>"zh-hant"</code><code>,</code>

<code>        </code><code>ja,</code>

<code>        </code><code>nl,</code>

<code>        </code><code>it,</code>

<code>        </code><code>es,</code>

<code>        </code><code>"es-mx"</code><code>,</code>

<code>        </code><code>ko,</code>

<code>        </code><code>pt,</code>

<code>        </code><code>"pt-pt"</code><code>,</code>

<code>        </code><code>da,</code>

<code>        </code><code>fi,</code>

<code>        </code><code>nb,</code>

<code>        </code><code>sv,</code>

<code>        </code><code>ru,</code>

<code>        </code><code>pl,</code>

<code>        </code><code>tr,</code>

<code>        </code><code>uk,</code>

<code>        </code><code>ar,</code>

<code>        </code><code>hr,</code>

<code>        </code><code>cs,</code>

<code>        </code><code>el,</code>

<code>        </code><code>he,</code>

<code>        </code><code>ro,</code>

<code>        </code><code>sk,</code>

<code>        </code><code>th,</code>

<code>        </code><code>id,</code>

<code>        </code><code>ms,</code>

<code>        </code><code>"en-gb"</code><code>,</code>

<code>        </code><code>"en-au"</code><code>,</code>

<code>        </code><code>ca,</code>

<code>        </code><code>hu,</code>

<code>        </code><code>vi,</code>

<code>        </code><code>hi</code>

<code>    </code><code>applelocale = </code><code>"en_us"</code><code>;</code>

<code>    </code><code>msvloggingmasterswitchenabledkey = 0;</code>

<code>    </code><code>"\u5e94\u75281"</code> <code>= </code><code>"\u4f20\u9012\u7684\u503c"</code><code>;</code>

<code>}</code>

<code>--------------</code>

<code>應用1=傳遞的值</code>

這樣,我們就簡單實作了應用程式間的傳值,但是建議最好不要輕易作業系統的這個域。