-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path_n_i_overview_memory_cache_controller_8m_source.html
286 lines (265 loc) · 19.7 KB
/
_n_i_overview_memory_cache_controller_8m_source.html
1
2
3
4
5
6
7
8
9
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Nimbus: src/overview/src/NIOverviewMemoryCacheController.m Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="stylesheet.css" rel="stylesheet" type="text/css" />
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-24278774-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body>
<div id="page">
<div style="position:relative">
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<a style="float: right;margin-right:20px;margin-top:20px" href='http://www.pledgie.com/campaigns/15519'><img alt='Click here to support Nimbus development and make a donation at www.pledgie.com !' src='http://www.pledgie.com/campaigns/15519.png?skin_name=chrome' border='0' /></a>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">Nimbus
 <span id="projectnumber">0.9.3 - <a href="http://github.com/jverkoey/nimbus">Nimbus is proudly hosted on Github</a></span>
</div>
<div id="projectbrief">An iOS framework whose growth is bounded by O(documentation).</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.4-20110629 -->
</div>
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
initNavTree('_n_i_overview_memory_cache_controller_8m.html','');
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">src/overview/src/NIOverviewMemoryCacheController.m</div> </div>
</div>
<div class="contents">
<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">//</span>
<a name="l00002"></a>00002 <span class="comment">// Copyright 2012 Jeff Verkoeyen</span>
<a name="l00003"></a>00003 <span class="comment">//</span>
<a name="l00004"></a>00004 <span class="comment">// Licensed under the Apache License, Version 2.0 (the "License");</span>
<a name="l00005"></a>00005 <span class="comment">// you may not use this file except in compliance with the License.</span>
<a name="l00006"></a>00006 <span class="comment">// You may obtain a copy of the License at</span>
<a name="l00007"></a>00007 <span class="comment">//</span>
<a name="l00008"></a>00008 <span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span>
<a name="l00009"></a>00009 <span class="comment">//</span>
<a name="l00010"></a>00010 <span class="comment">// Unless required by applicable law or agreed to in writing, software</span>
<a name="l00011"></a>00011 <span class="comment">// distributed under the License is distributed on an "AS IS" BASIS,</span>
<a name="l00012"></a>00012 <span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span>
<a name="l00013"></a>00013 <span class="comment">// See the License for the specific language governing permissions and</span>
<a name="l00014"></a>00014 <span class="comment">// limitations under the License.</span>
<a name="l00015"></a>00015 <span class="comment">//</span>
<a name="l00016"></a>00016
<a name="l00017"></a>00017 <span class="preprocessor">#import "NIOverviewMemoryCacheController.h"</span>
<a name="l00018"></a>00018
<a name="l00019"></a>00019 <span class="preprocessor">#import "NIDeviceInfo.h"</span>
<a name="l00020"></a>00020 <span class="preprocessor">#import "NimbusModels.h"</span>
<a name="l00021"></a>00021 <span class="preprocessor">#import "NimbusCore.h"</span>
<a name="l00022"></a>00022
<a name="l00023"></a>00023 <span class="keyword">@interface </span><a class="code" href="interface_n_i_memory_cache.html" title="An in-memory cache for storing objects with expiration support.">NIMemoryCache</a>(Private)
<a name="l00024"></a>00024 <span class="keyword">@property</span> (nonatomic, readwrite, retain) <a class="code" href="interface_n_i_linked_list.html" title="A singly linked list implementation.">NILinkedList</a>* lruCacheObjects;
<a name="l00025"></a>00025 <span class="keyword">@end</span>
<a name="l00026"></a>00026
<a name="l00027"></a>00027 <span class="keyword">@interface </span><a class="code" href="interface_n_i_overview_memory_cache_controller.html" title="A view controller that displays the contents of an in-memory cache.">NIOverviewMemoryCacheController</a>()
<a name="l00028"></a>00028 <span class="keyword">@property</span> (nonatomic, readonly, retain) <a class="code" href="interface_n_i_memory_cache.html" title="An in-memory cache for storing objects with expiration support.">NIMemoryCache</a>* cache;
<a name="l00029"></a>00029 <span class="keyword">@property</span> (nonatomic, readwrite, retain) <a class="code" href="class_n_i_table_view_model.html" title="A non-mutable table view model that complies to the UITableViewDataSource protocol.">NITableViewModel</a>* model;
<a name="l00030"></a>00030 <span class="keyword">@end</span>
<a name="l00031"></a>00031
<a name="l00035"></a>00035 <span class="keyword">@implementation </span><a class="code" href="interface_n_i_overview_memory_cache_controller.html" title="A view controller that displays the contents of an in-memory cache.">NIOverviewMemoryCacheController</a>
<a name="l00036"></a>00036
<a name="l00037"></a>00037 <span class="keyword">@synthesize</span> cache = _cache;
<a name="l00038"></a>00038 <span class="keyword">@synthesize</span> model = _model;
<a name="l00039"></a>00039
<a name="l00040"></a>00040
<a name="l00042"></a>00042 - (void)dealloc {
<a name="l00043"></a>00043 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
<a name="l00044"></a>00044 [nc removeObserver:self];
<a name="l00045"></a>00045
<a name="l00046"></a>00046 [_cache release];
<a name="l00047"></a>00047
<a name="l00048"></a>00048 [<span class="keyword">super</span> dealloc];
<a name="l00049"></a>00049 }
<a name="l00050"></a>00050
<a name="l00051"></a>00051
<a name="l00053"></a>00053 - (id)initWithMemoryCache:(<a class="code" href="interface_n_i_memory_cache.html" title="An in-memory cache for storing objects with expiration support.">NIMemoryCache</a> *)cache {
<a name="l00054"></a>00054 <span class="keywordflow">if</span> ((<span class="keyword">self</span> = [super initWithStyle:UITableViewStyleGrouped])) {
<a name="l00055"></a>00055 _cache = [cache retain];
<a name="l00056"></a>00056
<a name="l00057"></a>00057 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
<a name="l00058"></a>00058 [nc addObserver: self
<a name="l00059"></a>00059 selector: @selector(didReceiveMemoryWarning:)
<a name="l00060"></a>00060 name: UIApplicationDidReceiveMemoryWarningNotification
<a name="l00061"></a>00061 object: nil];
<a name="l00062"></a>00062 UIBarButtonItem* refreshButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(didTapRefreshButton:)] autorelease];
<a name="l00063"></a>00063 <span class="keyword">self</span>.navigationItem.rightBarButtonItem = refreshButton;
<a name="l00064"></a>00064 }
<a name="l00065"></a>00065 <span class="keywordflow">return</span> <span class="keyword">self</span>;
<a name="l00066"></a>00066 }
<a name="l00067"></a>00067
<a name="l00068"></a>00068
<a name="l00070"></a>00070 - (id)initWithStyle:(UITableViewStyle)style {
<a name="l00071"></a>00071 <span class="keywordflow">return</span> [<span class="keyword">self</span> initWithMemoryCache:[<a class="code" href="interface_nimbus.html" title="The Nimbus state interface.">Nimbus</a> <a class="code" href="interface_nimbus.html#a3c0417e0cf4a64e6d8004346fc744ce3" title="Access the global image memory cache.">imageMemoryCache</a>]];
<a name="l00072"></a>00072 }
<a name="l00073"></a>00073
<a name="l00074"></a>00074
<a name="l00077"></a>00077 <span class="preprocessor">#pragma mark - Model</span>
<a name="l00078"></a>00078 <span class="preprocessor"></span>
<a name="l00079"></a>00079
<a name="l00081"></a>00081 - (void)refreshModel {
<a name="l00082"></a>00082 NSMutableArray* contents = [NSMutableArray array];
<a name="l00083"></a>00083 <a class="code" href="class_n_s_string.html" title="For manipulating NSStrings.">NSString</a>* summary = nil;
<a name="l00084"></a>00084
<a name="l00085"></a>00085 <span class="comment">// Display a summary.</span>
<a name="l00086"></a>00086 <span class="keywordflow">if</span> ([<span class="keyword">self</span>.cache isKindOfClass:[<a class="code" href="interface_n_i_image_memory_cache.html" title="An in-memory cache for storing images with caps on the total number of pixels.">NIImageMemoryCache</a> <span class="keyword">class</span>]]) {
<a name="l00087"></a>00087 NIImageMemoryCache* imageCache = (NIImageMemoryCache *)<span class="keyword">self</span>.cache;
<a name="l00088"></a>00088 summary = [<a class="code" href="class_n_s_string.html" title="For manipulating NSStrings.">NSString</a> stringWithFormat:
<a name="l00089"></a>00089 @"Number of images: %d\nNumber of pixels: %@/%@\nStress limit: %@",
<a name="l00090"></a>00090 self.cache.count,
<a name="l00091"></a>00091 NIStringFromBytes(imageCache.numberOfPixels),
<a name="l00092"></a>00092 NIStringFromBytes(imageCache.maxNumberOfPixels),
<a name="l00093"></a>00093 NIStringFromBytes(imageCache.maxNumberOfPixelsUnderStress)];
<a name="l00094"></a>00094
<a name="l00095"></a>00095 } <span class="keywordflow">else</span> {
<a name="l00096"></a>00096 summary = [<a class="code" href="class_n_s_string.html" title="For manipulating NSStrings.">NSString</a> stringWithFormat:
<a name="l00097"></a>00097 @"Number of objects: %d",
<a name="l00098"></a>00098 self.cache.count];
<a name="l00099"></a>00099 }
<a name="l00100"></a>00100 [contents addObject:[<a class="code" href="interface_n_i_table_view_model_footer.html" title="An object used in sectioned arrays to denote a section footer title.">NITableViewModelFooter</a> footerWithTitle:summary]];
<a name="l00101"></a>00101
<a name="l00102"></a>00102 NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease];
<a name="l00103"></a>00103 <span class="comment">// We care more about time than date here.</span>
<a name="l00104"></a>00104 [formatter setDateStyle:NSDateFormatterShortStyle];
<a name="l00105"></a>00105 [formatter setTimeStyle:NSDateFormatterMediumStyle];
<a name="l00106"></a>00106
<a name="l00107"></a>00107 <span class="comment">// Add each of the cache objects to the model.</span>
<a name="l00108"></a>00108 <span class="keywordflow">for</span> (<span class="keywordtype">id</span> cacheObject in <span class="keyword">self</span>.cache.lruCacheObjects) {
<a name="l00109"></a>00109 <a class="code" href="class_n_s_string.html" title="For manipulating NSStrings.">NSString</a>* name = nil;
<a name="l00110"></a>00110 UIImage* image = nil;
<a name="l00111"></a>00111 NSDate* lastAccessTime = nil;
<a name="l00112"></a>00112
<a name="l00113"></a>00113 <span class="comment">// We're accessing a private object from the core here, so we can't assume that any of</span>
<a name="l00114"></a>00114 <span class="comment">// these selectors will be around forever. That being said, we should try to remember to</span>
<a name="l00115"></a>00115 <span class="comment">// update this controller if the cache object internals ever change.</span>
<a name="l00116"></a>00116 <span class="comment">// If any of these assertions fire it means we've changed the cache object signatures but</span>
<a name="l00117"></a>00117 <span class="comment">// haven't gotten around to updating this controller yet.</span>
<a name="l00118"></a>00118 NIDASSERT([cacheObject respondsToSelector:<span class="keyword">@selector</span>(name)]);
<a name="l00119"></a>00119 <span class="keywordflow">if</span> ([cacheObject respondsToSelector:<span class="keyword">@selector</span>(name)]) {
<a name="l00120"></a>00120 name = [cacheObject performSelector:@selector(name)];
<a name="l00121"></a>00121 }
<a name="l00122"></a>00122 NIDASSERT([cacheObject respondsToSelector:<span class="keyword">@selector</span>(<span class="keywordtype">object</span>)]);
<a name="l00123"></a>00123 <span class="keywordflow">if</span> ([cacheObject respondsToSelector:<span class="keyword">@selector</span>(<span class="keywordtype">object</span>)]) {
<a name="l00124"></a>00124 <span class="keywordtype">id</span> <span class="keywordtype">object</span> = [cacheObject performSelector:@selector(object)];
<a name="l00125"></a>00125 <span class="keywordflow">if</span> ([<span class="keywordtype">object</span> isKindOfClass:[UIImage <span class="keyword">class</span>]]) {
<a name="l00126"></a>00126 image = object;
<a name="l00127"></a>00127 }
<a name="l00128"></a>00128 }
<a name="l00129"></a>00129 NIDASSERT([cacheObject respondsToSelector:<span class="keyword">@selector</span>(lastAccessTime)]);
<a name="l00130"></a>00130 <span class="keywordflow">if</span> ([cacheObject respondsToSelector:<span class="keyword">@selector</span>(lastAccessTime)]) {
<a name="l00131"></a>00131 lastAccessTime = [cacheObject performSelector:@selector(lastAccessTime)];
<a name="l00132"></a>00132 }
<a name="l00133"></a>00133
<a name="l00134"></a>00134 [contents addObject:
<a name="l00135"></a>00135 [<a class="code" href="interface_n_i_subtitle_cell_object.html" title="An object for displaying two lines of text in a table view cell.">NISubtitleCellObject</a> objectWithTitle:name
<a name="l00136"></a>00136 subtitle:[<a class="code" href="class_n_s_string.html" title="For manipulating NSStrings.">NSString</a> stringWithFormat:
<a name="l00137"></a>00137 @"Last access: %@",
<a name="l00138"></a>00138 [formatter stringFromDate:lastAccessTime]]
<a name="l00139"></a>00139 image:image]];
<a name="l00140"></a>00140 }
<a name="l00141"></a>00141
<a name="l00142"></a>00142 <span class="keywordflow">if</span> (0 == <span class="keyword">self</span>.cache.<a class="code" href="interface_n_i_memory_cache.html#a61996ab64791ed19840b5055b68c7c95" title="Returns the number of objects currently in the cache.">count</a>) {
<a name="l00143"></a>00143 [contents addObject:[<a class="code" href="interface_n_i_title_cell_object.html" title="An object for displaying a single-line title in a table view cell.">NITitleCellObject</a> objectWithTitle:@"No cache objects"]];
<a name="l00144"></a>00144 }
<a name="l00145"></a>00145
<a name="l00146"></a>00146 [contents addObject:[<a class="code" href="interface_n_i_table_view_model_footer.html" title="An object used in sectioned arrays to denote a section footer title.">NITableViewModelFooter</a> footerWithTitle:
<a name="l00147"></a>00147 @"The most-recently-used object is here at the bottom"]];
<a name="l00148"></a>00148
<a name="l00149"></a>00149 <span class="keyword">self</span>.model = [[[<a class="code" href="class_n_i_table_view_model.html" title="A non-mutable table view model that complies to the UITableViewDataSource protocol.">NITableViewModel</a> alloc] initWithSectionedArray:contents
<a name="l00150"></a>00150 delegate:(id)[<a class="code" href="interface_n_i_cell_factory.html" title="A simple factory for creating table view cells from objects.">NICellFactory</a> class]] autorelease];
<a name="l00151"></a>00151 <span class="keyword">self</span>.tableView.dataSource = <span class="keyword">self</span>.model;
<a name="l00152"></a>00152 [<span class="keyword">self</span>.tableView reloadData];
<a name="l00153"></a>00153 }
<a name="l00154"></a>00154
<a name="l00155"></a>00155
<a name="l00157"></a>00157 - (void)viewDidLoad {
<a name="l00158"></a>00158 [<span class="keyword">super</span> viewDidLoad];
<a name="l00159"></a>00159
<a name="l00160"></a>00160 [<span class="keyword">self</span> refreshModel];
<a name="l00161"></a>00161 }
<a name="l00162"></a>00162
<a name="l00163"></a>00163
<a name="l00165"></a>00165 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
<a name="l00166"></a>00166 <span class="keywordflow">return</span> <a class="code" href="group___device-_orientation.html#gad11b7958206db7c5d5a85d78f6d5ce4b" title="For use in shouldAutorotateToInterfaceOrientation:">NIIsSupportedOrientation</a>(toInterfaceOrientation);
<a name="l00167"></a>00167 }
<a name="l00168"></a>00168
<a name="l00169"></a>00169
<a name="l00172"></a>00172 <span class="preprocessor">#pragma mark - Notifications</span>
<a name="l00173"></a>00173 <span class="preprocessor"></span>
<a name="l00174"></a>00174
<a name="l00176"></a>00176 - (void)didReceiveMemoryWarning:(NSNotification *)notification {
<a name="l00177"></a>00177 [<span class="keyword">self</span> refreshModel];
<a name="l00178"></a>00178 }
<a name="l00179"></a>00179
<a name="l00180"></a>00180
<a name="l00183"></a>00183 <span class="preprocessor">#pragma mark - Actions</span>
<a name="l00184"></a>00184 <span class="preprocessor"></span>
<a name="l00185"></a>00185
<a name="l00187"></a>00187 - (void)didTapRefreshButton:(UIBarButtonItem *)button {
<a name="l00188"></a>00188 [<span class="keyword">self</span> refreshModel];
<a name="l00189"></a>00189 }
<a name="l00190"></a>00190
<a name="l00191"></a>00191 <span class="keyword">@end</span>
</pre></div><div id="disqus_thread"></div></div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><b>NIOverviewMemoryCacheController.m</b> </li>
</div><!-- .fixedwidth -->
<script type="text/javascript">
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
var disqus_shortname = 'nimbusdocumentation'; // required: replace example with your forum shortname
// The following are highly recommended additional parameters. Remove the slashes in front to use.
// var disqus_identifier = 'unique_dynamic_id_1234';
// var disqus_url = 'http://example.com/permalink-to-page.html';
/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<span class="footer">Generated for Nimbus by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4-20110629 </span>
</ul>
</div>
</div> <!-- page -->
</body>
</html>