我有一个简单的程序需要记录并持久存储每次用户在表视图中选择项目时产生的2个简单数据。这两个数据是1)点击的时间(NSDate
)和2)点击的项目的名称(NSString
)。此时,此信息采用以下形式:
TimerEvent *latestTappedEvent = [[TimerEvent alloc] init];
latestTappedEvent.timeTapped = NSDate.date;
latestTappedEvent.activityTapped = tappedItem.itemName;
这两个数据必须保持相互关联。
我的问题是:
如何按时间顺序将这些数据输入和输出plist?
在我的研究中,我只是变得更加困惑。对我来说,如何使用plist并不明显。最初,我认为我可以使用NSMutableDictionary
latestTappedEvent.timeTapped
作为关键字,latestTappedEvent.activityTapped
作为值。但是当我尝试手动构建plist时,似乎不可能,而是想要一个字符串作为键。
如果有人能帮助我理解这一点,最好是通过图形表示这些不同元素之间的关系,我将永远感激。
答案 0 :(得分:2)
字典和数组都存储“东西” - 存储的东西通过使用“其他东西”来检索和设置,以对数据结构进行“查找”。在数组中,该查找是存储对象的数组中的索引。以表格形式:
Index Storage
0 "some string stored at index 0"
1 "some other string"
2 <some other object, stored at index 2>
要查找"some string stored at index 0"
,您需要知道它存储在索引0处,并向该数组询问该索引处的对象。因此数组使用整数来查找存储在其中的对象,并且这些整数必须在0到数组的数减1的范围内。使用整数查找数组中的项也会给出数组顺序 - top to to - 您在上表中看到的底线排序与代码中迭代产生的顺序相同。
字典使用任意对象进行查找,这也意味着字典中没有排序,只有一组键的关联和它们所引用的内容。以表格形式:
Key Storage
"name" "a string that will be accessed using the key 'name'"
"number" <some numeric object, that will be accessed using the key 'number'>
<object> "will be accessed with key <object> which is an arbitrary object"
要从此词典中获取"a string that will be accessed using the key 'name'"
,请向字典询问密钥"name"
下存储的内容。
在上面的例子中,我给表标题“索引 - 存储”或“密钥 - 存储”,但要回到这些结构存储的东西帽子是用另一个东西访问的点,让我们查看数组更通用的表格:
Thing used to access the thing that's stored Thing that's stored
0 "some string stored at index 0"
1 "some other string"
2 <some other object, stored at index 2>
再次,字典,使用相同的表:
Thing used to access the thing that's stored Thing that's stored
"name" "a string that will be accessed using the key 'name'"
"number" <some numeric object, that will be accessed using the key 'number'>
<object> "will be accessed with key <object> which is an arbitrary object"
另外,让我们在同一张表中查看您的课程TimerEvent
:
Thing used to access the thing that's stored Thing that's stored
timeTapped <date object>
activityTapped "name of an activity"
左列中的项目是Objective-C属性名称,右侧的项目是这些属性包含的值。现在,再看一下字典 - 左边的项是任意值(实际上它们通常是字符串),右边的项是其他任意值。希望您可以在此处看到连接 - 您通常可以将对象的属性表示为字典,将属性名称的字符串表示形式映射到属性存储的值。因此,如果您想在字典中表示TimerEvent
对象,您最终会得到如下表示:
Key Object
"timeTapped" <date object>
"activityTapped" "activity name"
上表说明了数组,字典和其他对象之间的共性和差异,并显示使用字典将属性名称映射到属性值可以表示任何给定对象的属性。那么,代码怎么做呢?假设我们要在TimerEvent
中代表timerEvent
对象NSDictionary
:
NSDictionary *timerEventRepresentation = @{ @"timeTapped": timerEvent.timeTapped,
@"activityTapped": timerEvent.activityTapped};
以下是我们如何从字典表示中创建TimerEvent
:
TimerEvent *timerEvent = [[TimerEvent alloc] init];
timerEvent.timeTapped = timerEventDictionaryRepresentation[@"timeTapped"];
timerEvent.activityTapped = timerEventDictionaryRepresentation[@"activityTapped"];
将所有对象强制转换为字典的目的是,属性列表格式仅序列化几个类 - NSArray
,NSDictionary
,NSString
,NSDate
,{{ 1}}和NSNumber
。因此,我们编写代码来使用受支持的类来表示不受支持的类,反之亦然,以便在plists中序列化这些对象。
作为附录,您提到您需要存储所有水龙头的记录,并对它们进行排序。正如我上面提到的,数组固有地对它们存储的东西进行排序,因此这是适当的解决方案。你想要构建这样的东西:
NSData
在代码中,序列化每个tap会采用与前面描述的相同的形式,但请确保在Index Item
0 <dictionary representing first tap>
1 <dictionary representing second tap>
...
n <dictionary representing n-1th tap>
属性上添加额外的步骤,使用新创建的字典作为addObject:
属性参数。