git从远程库同步到本地仓库

目录

  1. 远程仓库发生改变,本地仓库没有改变
  2. 远程仓库没有改变,本地仓库发生改变
  3. 远程仓库,本地仓库都发生改变

有三种方式的情况下,如何做到没有Bug的合并代码。。。


远程仓库发生改变,本地仓库没有改变

  • 首先,查看远程仓库 git remote -v

    1
    2
    3
    $ git remote -v
    origin git@github.com:{User}/Understanding_Unix-Linux_Programming.git (fetch)
    origin git@github.com:{User}/Understanding_Unix-Linux_Programming.git (push)
  • 把远程库更新到本地 git fetch origin master

    1
    2
    3
    4
    $ git fetch origin master
    Warning: Permanently added the RSA host key for IP address '{IP address such as: 192.168.1.1 }' to the list of known hosts.
    From github.com:{User}/Understanding_Unix-Linux_Programming
    * branch master -> FETCH_HEAD
  • 比较远程更新和本地版本库的差异 git log master.. origin/master

    1
    2
    3
    4
    5
    6
    $ git log master.. origin/master
    commit ce39f8b3eeee898a2a038444f897f2aef3673493
    Author: {User} <794870409@qq.com>
    Date: Fri Feb 26 14:14:39 2016 +0800

    {The context origin added ... }
  • 合并远程库 git merge origin/master

    • 有差异

      1
      2
      3
      4
      5
      $ git merge origin/master
      Updating eb32b20..ce39f8b
      Fast-forward
      README.md | 2 +-
      1 file changed, 1 insertion(+), 1 deletion(-)
    • 无差异

      1
      2
      $ git merge origin/master
      Already up-to-date

远程仓库没有改变,本地仓库发生改变

命令推荐

1
2
3
4
git status // 查看版本库的状态
git add .|[file you want add like README.md] // 添加修改的文件进入版本库
git commit -m "the content of your modify" // 提交版本库
git push -u origin master // 上传到远程版本库

  • 首先你的文件出现了修改 git status
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ git status
    On branch master
    Your branch is up-to-date with 'origin/master'.
    Changes not staged for commit:
    (use "git add <file>..." to update what will be committed)
    (use "git checkout -- <file>..." to discard changes in working directory)

    modified: README.md

    no changes added to commit (use "git add" and/or "git commit -a")

你的文件被修改后就会出现这样的显示

  • 添加文件 git add .|[或者某个文件]|like: README.md
    1
    2
    3
    4
    5
    6
    7
    8
    $ git add README.md
    $ git status
    On branch master
    Your branch is up-to-date with 'origin/master'.
    Changes to be committed:
    (use "git reset HEAD <file>..." to unstage)

    modified: README.md

文件添加后,就会出现这种

  • 提交文件 git commit -m "content"
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ git commit -m "update content"
    [master 7456161] update content
    Committer: {User} <wuyingqiang@wuyingqiangs-MacBook-Pro.local>
    Your name and email address were configured automatically based
    on your username and hostname. Please check that they are accurate.
    You can suppress this message by setting them explicitly. Run the
    following command and follow the instructions in your editor to edit
    your configuration file:

    git config --global --edit

    After doing this, you may fix the identity used for this commit with:

    git commit --amend --reset-author

    1 file changed, 8 insertions(+), 3 deletions(-)

文件提交到你的版本库,这样本地版本就更新了

  • 和远程库进行同步 git push -u origin master
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ git push -u origin master
    Counting objects: 3, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (3/3), 417 bytes | 0 bytes/s, done.
    Total 3 (delta 1), reused 0 (delta 0)
    To git@github.com:scofieldWyq/Understanding_Unix-Linux_Programming.git
    ce39f8b..7456161 master -> master
    Branch master set up to track remote branch master from origin.

这样我们的版本库同步也就好了。


远程仓库,本地仓库都发生改变

以后再说咯。。。


总结

  • 掌握 git 远程和本地的同步很重要的。
  • 还有解决同步产生的问题也是锻炼自己的一个机会。

Baidu网盘的内容作为外链使用

目录

1.百度网盘的优势
2.利用百度网盘
3.实现外链的使用

如果想直接完成设置,不想了解过程,可以直接跳到 实现外链的使用

百度网盘的优势

  • 百度网盘免费提供了 2T 的免费的云空间(多么好的事情,嘻嘻)
  • 然后在速度方面,可以说是国内可以的了。
  • 没有广告,后台很硬。百度的技术能力你们懂的。。。。。

  • 百度云是由百度公司出品的一款云服务产品,不仅为用户提供免费存储空间,还可以将视频、照片、文档、通讯录数据在移动设备和PC端之间跨平台同步、备份等,百度云还支持添加好友、创建群组,和伙伴们快乐分享, 目前已上线:Android、iPhone、iPad、百度云管家、网页端等.

百度云盘的优点 ( 来源于 百度百科 )

  • 数据共享

    • 支持Web,PC,Android、iPhone、WindowsPhone手机客户端等多个平台,[3] 进行跨平台、跨终端的文件共享,随时随地访问。用户上传的文件都会保存在云端,在访问文件时,无论登录哪个平台都可以访问到所有平台存储的文件;存储随意,访问方便。
  • 文件分类浏览

    • 自动对用户文件进行分类,浏览查找更方便。按照用户存储的文件类型对用户上传文件进行自动分类,极大方便了用户浏览以及对文件的管理,独具特色。
  • 快速上传

    • Web版支持最大1GB 单文件上传,PC客户端最大支持4GB单文件上传,上传不限速;可进行批量操作,轻松便利。网络速度有多快上传速度就有多快。同时,还可以批量操作上传,方便实用。上传文件时,自动将要上传的文件与云端资源库进行匹配,如果匹配成功,则可以秒传,最大限度节省您的上传时间。
  • 离线下载

    • 只需输入你需要下载的文件链接,服务器将自动帮你下载到网盘中。最大限度节省用户将文件存至网盘的时间。
  • 数据安全

    • 百度强大的云存储集群,是目前最具优势的存储机制,提供了完善高效的服务:高效的云端存储速度,以及稳定可靠的数据安全。完善的文件访问控制机制,提供了必备的数据安全屏障。依托百度大规模可靠存储,一份文件多份备份,防范一切意外。数据传输加密,有效防止数据窃取。
  • 轻松好友分享

    • 轻松进行文件及文件夹的分享,支持短信、邮件、链接、秘密分享等分享方式,让你的好友和你一起High起来。好友分享时,设有相应的提取码,只有输入相应的提取码才能访问分享的文件,有效确保了隐私安全。
  • 闪电互传

    • 闪电互传是百度云推出的数据传输功能,使用“闪电互传”在2台及多台移动设备上(主要是:手机、IPad),相互传输电影、视频、游戏等,无需网络、WiFi,真正的零流量传输,传输文件的速度比蓝牙快70倍,同时支持安卓、苹果自由互传。

利用百度网盘

写了自己的博客,然后发现一些资源需要上传到网上,但是我们需要一个由外往地址的服务器。这个对于一个学生党来说是一笔不小的开销哦。所以我们可以使用免费的东西来实现我们想要的外部链接,就是用百度云盘来实现的。

实现外链的使用

  • 前提是你要有 百度网盘 的账号, 不然一切都免谈啦。。。

网盘上有一个可供分享链接的文件

  • 网盘已经有文件
    >
    B_1
    >
    B_2
    >
    B_3
    >
    B_4
    >

    然后复制链接到浏览器

    B_5
    但是需要注意哦,应该单个文件的创建共享,不然就会变成这样

    B_6

  • 网盘没有文件
    >
    那就上传一个吧

    B_7

    B_8

    B_9

复制图片的链接,形成外链

>
B_10

然后在你需要的地方,把这个链接复制上去就可以了

B_11

总结

文章参考

个人意见

因为在七牛使用的空间有限,特意想到这个,实践证明可行。

Warning

这种方法图片只能使用一天而已,然后链接就失效了。

参考一个在Github上的外链设置

IOS_Location_After_8.0

>>> IOS 定位失败 <<<

目录

A - IOS 定位过程中没有任何反应

B - 现在我大概走一下流程

C - 问题出现了。。。。。。。。。。。

D - 开始解决问题

Warning

A - IOS 定位过程中没有任何反应

在你很高兴的按照一些网上的教程设置好你的location之后,很不幸你却发现你的定位delegate并没有任何的响应。如果你使用button作为测试的时候,点击你的button,就是没有任何反应。

如果不想了解前提,可以直接跳到 问题的解决方案

B - 现在我大概走一下流程

设置好你的代码

> image

> image

> image

> image


C - 问题出现了。。。。。。。。。。。

1.高兴之后却发现定位竟然没有任何反应。。。坑死了 -_-!

2.然后就是一堆问题的搜索

image

然后就发现这些参考:

iOS8中定位服务的变化(CLLocationManager协议方法不响应,无法回掉GPS方法,不出
ios8.0下CLLocationManager定位服务需要授权了
iOS CLLocationManager定位,IOS8注意
iOS CLLocationManager定位
iOS8中定位服务的变化(CLLocationManager协议方法不响应,无法回掉GPS方法,不出现获取权限提示)

收获来啦

image

3.然后定位到 Location Awareness PG Introduction

好多繁杂的搜索和过滤后,定位到了这个Location and Maps Programming Guide

image

但是貌似没有发现 8.0 之后的说法


D - 开始解决问题

1.IOS 8.0 之后的改变

很多的说法就是在 8.0 之后对于这一些安全措施进行了很多的设置,所以在你使用之前,需要去显式的开启它。不知道是真还是假,等以后有时间我在这个,目前还找不到。

所以这个就先空白一下。。。。。不好意思!嘻嘻

2.问题的解决方案

好,既然问题有了症状,那么就在下药。。。。

  • 设置你的info.plist文件,在Surporting files 目录里面。

  • 加上两个 Key - Value

    image

  • 在启动视图之前做好一些准备

    image

  • 现在开始调试

    image


E - Ok,我的定位也就 working 了, 你呢?

Warning - 需要注意的事项

  • 如果你没有设置那两个 Key-Value在 info.plist 文件里,授权提示还是会出现,只是效果和没有设置的差不多。

  • 然后呢,记得 <CLLocationManagerDelegate> 和 设置 delegate

  • 如果使用的是模拟器,那么按照上面的步骤还不行的话,是这重置一下模拟器,我就是这么干的,it working!

XML Parsing - IOS

什么是 XML

如果不知道它的产生,何谓使用它呢?

认识和了解 XML

  • XML 是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分。您可以创建内容,然后使用限定标记标记它,从而使每个单词、短语或块成为可识别、可分类的信息。您创建的文件,或文档实例 由元素(标记)和内容构成。

  • 当从打印输出读取或以电子形式处理文档时,元素能够帮助更好地理解文档。元素的描述性越强,文档各部分越容易识别。

  • 标记语言从早期的私有公司和政府制定形式逐渐演变成标准通用标记语言(Standard Generalized Markup Language,SGML)、超文本标记语言(Hypertext Markup Language,HTML),并且最终演变成 XML。SGML 比较复杂,HTML(实际上仅是一组元素集)在识别信息方面不够强大。XML 则是一种易于使用和易于扩展的标记语言。

  • 可以使用 XML 创建自己的元素,从而能够更精确地表示自己的信息。您可以在文档内部识别每个部分,而不是将文档看作仅由标题和段落组成。为了提高效率,您可能需要定义数量一定的元素,并统一使用它们。(您可以在文档类型定义(Document Type Definition, DTD )或模式 (schema)中定义元素,稍后我将对此进行简要的描述)。一旦习惯使用 XML 之后,就可以在构建文件时尝试处理元素名称。

  • 用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输。

    如果你想学习XML,点这里 - XML 新手入门基础知识

XML 长什么样呢?

image1

解析 XML

这里不做XML的生成,只是做解析。

XML 解析的过程

IOS 使用的是Delegate 来实现 XML 的解析 <NSXMLParserDelegate>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

//开始解析步骤
1. - (void)parserDidStartDocument:(NSXMLParser *)parser

//遇到一个 <tag>
2. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict

//找到<tag>中的内容
3. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

//遇到一个 </tag>
4. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName

//解析中出现了错误
5. - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError

//解析完成的最后收拾
6. - (void)parserDidEndDocument:(NSXMLParser *)parser

XML 解析流程说明

  • 从 1 开始,遇到一个<tag>, 调用2方法,遇到一个内容调用3方法,遇到一个</tag>调用4的方法,如果出现了解析错误就会调用5方法。知道解析结束掉用6方法。
    大概就是这么一个流程。

  • 2,3,4,5的方法的调用是多次的,依赖于xml的内容;1和6在整个解析过程中各自只有一次。

解析使用的例子:

XML

解析XML成Dictionary - 参考书上和自己的问题所作的类

这两个文件可以直接 食用 (千万不要真的把它给吃了,要消化啦。。。)

  • *.m 文件里面有delegate处理的使用, 有conform <NSXMLParserDelegate> 的说明

XMLParser.h

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

//
// XMLParser.h
// Test
//
// Created by wuyingqiang on 7/19/15.
// Copyright (c) 2015 wuyingqiang. All rights reserved.
//

/*
* first, set the prepare phase.
* second, start xml parse.
* finally, set the block of operation when xml parse was done.
* ------------------------------------------------------------
*
* <FUNCTIONALITY>: Parsing XML file into dictionary.
*
* this class just give you several class method to complete your goal.
* you don't need to set anything for this class, just use one method to deal with your problem.
*
* ---------------------------------------------------------------------------------------------
*
* <CLASS METHOD>:
* +xmlParseByData:completeBlock:
* +xmlParseByData:completeBlock:dictionaryCloseInArray:
* +xmlParseByURL:completeBlock:
* +xmlParseByURL:completeBlock:dictionaryCloseInArray:
* +xmlParseWithURLByString:completeBlock:
* +xmlParseWithURLByString:completeBlock:dictionaryCloseInArray:
* +xmlParseWithXMLParser:completeBlock:
* +xmlParseWithXMLParser:completeBlock:dictionaryCloseInArray:
*
* ---------------------------------------------------------------------------------------------
*
* <PARAMETER>:
*
* - data: (NSData *), the data from server you have already download.
*
* - url : (NSURL *), the url of xml in server.
*
* - stringOfURL : (NSString *), the string of URL.
*
* - parser: (NSXMLParser *), XML serializer you have download from server,and convertd. saved in NSXMLPareser.
*
* ------------------------------------------------------------------------------------------------------------------
*
* <EXAMPLE>:
*
* [[[XMLParser alloc] init] xmlParseByData:data
* completeBlock:^(NSDictionary *data) {
*
* // yet completed the parsing, data was saved in the
* // dictionary,which you have parsing done
*
* }];
*
* -----------------------------------------------------------------------------------------------------------------
*
* <CONSUMMER>:
*
* - the block's data is the result of parsing.
*
* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Having Fun - END >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-------------
*
*/

#import <Foundation/Foundation.h>

@interface XMLParser : NSObject

+ (void)xmlParseByData:(NSData *)data
completeBlock:(void (^)(NSDictionary *data)) parseCompleted;
+ (void)xmlParseByData:(NSData *)data
completeBlock:(void (^)(NSDictionary *data)) parseCompleted dictionaryCloseInArray:(BOOL)close;
/* parsing xml use data from server
*
*/

+ (void)xmlParseByURL:(NSURL *)url
completeBlock:(void (^)(NSDictionary *data)) parseCompleted;
+ (void)xmlParseByURL:(NSURL *)url
completeBlock:(void (^)(NSDictionary *data)) parseCompleted dictionaryCloseInArray:(BOOL)close;
/* parsing xml url
*
*/

+ (void)xmlParseWithURLByString:(NSString *)stringOfURL
completeBlock:(void (^)(NSDictionary *data)) parseCompleted;
+ (void)xmlParseWithURLByString:(NSString *)stringOfURL
completeBlock:(void (^)(NSDictionary *data)) parseCompleted dictionaryCloseInArray:(BOOL)close;
/* parsing xml by url string
*
*/
+ (void)xmlParseWithXMLParser:(NSXMLParser *) parser
completeBlock:(void (^)(NSDictionary *data)) parseCompleted;
+ (void)xmlParseWithXMLParser:(NSXMLParser *) parser
completeBlock:(void (^)(NSDictionary *data)) parseCompleted
dictionaryCloseInArray:(BOOL) close;
/* parsing xml by NSXMLparser
*
*/
@end

XMLParser.m

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
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396

//
// XMLParser.m
// Test
//
// Created by wuyingqiang on 7/19/15.
// Copyright (c) 2015 wuyingqiang. All rights reserved.
//

#import "XMLParser.h"

/*
* define the parsing mode
*
*/
typedef NS_ENUM(NSInteger, ParseMode) {
ParseModeByData = 1,
ParseModeByString = 2,
ParseModeByURL = 3,
ParseModeByXMLParser= 4
};

typedef void (^parseDoneBlock)(NSDictionary *data);

@interface XMLParser() <NSXMLParserDelegate>

/* block , which is for complete operation */
@property (nonatomic, weak) parseDoneBlock parseCompleteNow;

/* data from source */
@property (nonatomic, strong) NSData *data;
/* url of network */
@property (nonatomic, strong) NSURL *Url;

/* xml operation stack */
@property (nonatomic, strong) NSMutableArray *elementStack;

/* character of finding */
@property (nonatomic, strong) NSMutableString *textGet;

/* xml which array closed */
@property (nonatomic) BOOL close;

- (void)setURL:(NSString *)urlString;
- (void)startWithParseMode:(ParseMode)mode comcompleteBlock:(void (^)(NSDictionary *))parseCompleted dataSource:(NSObject *)source arrayClosed:(BOOL) close;

@end
@implementation XMLParser

#pragma mark - Class Method.

/* class method in no dictionary close in array mode.
*
* SUCH AS:
* <data>
* <current_condition>
* <cloudcover>16</cloudcover>
* <humidity>59</humidity>
* <observation_time>09:09 PM</observation_time>
* <precipMM>0.1</precipMM>
* <pressure>1010</pressure>
* <temp_C>10</temp_C>
* <temp_F>49</temp_F>
* <visibility>10</visibility>
* <weatherCode>113</weatherCode>
* <weatherDesc>
* <Value>Clear</Value>
* </weatherDesc>
* <weatherIconUrl>
* <value>
* http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0008_clear_sky_night.png
* </value>
* </weatherIconUrl>
* <winddir16Point>NW</winddir16Point>
* <winddirDegree>316</winddirDegree>
* <windspeedKmph>47</windspeedKmph>
* <windspeedMiles>29</windspeedMiles>
* </current_condition>
*
* ----------------------------------------------------------------------------------------------------------------
* After `DICTIONARY IN ARRAY` parsing:
*
* data = {
* "current_condition" = [
* {
* cloudcover = 16;
* humidity = 59;
* "observation_time" = "09:09 PM";
* precipMM = "0.1";
* pressure = 1010;
* "temp_C" = 10;
* "temp_F" = 49;
* visibility = 10;
* weatherCode = 113;
* weatherDesc = [
* {
* value = Clear;
* }
* ];
* weatherIconUrl = [
* {
* value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0008_clear_sky_night.png";
* }
* ];
* winddir16Point = NW;
* winddirDegree = 316;
* windspeedKmph = 47;
* windspeedMiles = 29;
* }
* ];
*
* ---------------------------------------------------------------------------------------------------------------
* Without `DICTIONARY IN ARRAY` parsing:
*
*
* data = {
* "current_condition" = {
* cloudcover = 16;
* humidity = 59;
* "observation_time" = "09:09 PM";
* precipMM = "0.1";
* pressure = 1010;
* "temp_C" = 10;
* "temp_F" = 49;
* visibility = 10;
* weatherCode = 113;
* weatherDesc = {
* value = Clear;
* }
* weatherIconUrl = {
* value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0008_clear_sky_night.png";
* };
* winddir16Point = NW;
* winddirDegree = 316;
* windspeedKmph = 47;
* windspeedMiles = 29;
* };
*
* ------------------------------------------------------------------------------------------------------------
*
*/

// generation mode
+ (void)xmlParseByData:(NSData *)data
completeBlock:(void (^)(NSDictionary *))parseCompleted {

[[[XMLParser alloc] init] startWithParseMode:ParseModeByData
comcompleteBlock:parseCompleted
dataSource:data
arrayClosed:NO];
}
+ (void)xmlParseByURL:(NSURL *)url
completeBlock:(void (^)(NSDictionary *))parseCompleted {

[[[XMLParser alloc] init] startWithParseMode:ParseModeByURL
comcompleteBlock:parseCompleted
dataSource:url
arrayClosed:NO];
}
+ (void)xmlParseWithURLByString:(NSString *)stringOfURL
completeBlock:(void (^)(NSDictionary *))parseCompleted {

NSURL *url = [NSURL URLWithString:stringOfURL];

[XMLParser xmlParseByURL:url
completeBlock:parseCompleted];

}
+ (void)xmlParseWithXMLParser:(NSXMLParser *)parser
completeBlock:(void (^)(NSDictionary *))parseCompleted {
[[[XMLParser alloc] init] startWithParseMode:ParseModeByXMLParser
comcompleteBlock:parseCompleted
dataSource:parser
arrayClosed:NO];
}

// `dictionary in array` mode
+ (void)xmlParseByData:(NSData *)data completeBlock:(void (^)(NSDictionary *))parseCompleted dictionaryCloseInArray:(BOOL)close {
[[[XMLParser alloc] init] startWithParseMode:ParseModeByData
comcompleteBlock:parseCompleted
dataSource:data
arrayClosed:close];
}
+ (void)xmlParseByURL:(NSURL *)url completeBlock:(void (^)(NSDictionary *))parseCompleted dictionaryCloseInArray:(BOOL)close {

[[[XMLParser alloc] init] startWithParseMode:ParseModeByURL
comcompleteBlock:parseCompleted
dataSource:url
arrayClosed:close];
}
+ (void)xmlParseWithURLByString:(NSString *)stringOfURL completeBlock:(void (^)(NSDictionary *))parseCompleted dictionaryCloseInArray:(BOOL)close {

NSURL *url = [NSURL URLWithString:stringOfURL];

[XMLParser xmlParseByURL:url
completeBlock:parseCompleted dictionaryCloseInArray:close];

}
+ (void)xmlParseWithXMLParser:(NSXMLParser *)parser
completeBlock:(void (^)(NSDictionary *))parseCompleted
dictionaryCloseInArray:(BOOL)close {

[[[XMLParser alloc] init] startWithParseMode:ParseModeByXMLParser
comcompleteBlock:parseCompleted
dataSource:parser
arrayClosed:close];
}

#pragma mark - Private Method.
- (void)setURL:(NSString *)urlString
/*
* set the URL
*
*/
{

[self setUrl:[NSURL URLWithString:urlString]];
}

- (void)startWithParseMode:(ParseMode)mode comcompleteBlock:(void (^)(NSDictionary *))parseCompleted dataSource:(NSObject *)source arrayClosed:(BOOL) close
/*
* start to parsing ...
*
*/
{


NSXMLParser *parse;
_close = close;

/* block */
_parseCompleteNow = parseCompleted;

/* set the parse mode */
switch (mode) {
case ParseModeByData:
{
NSData *data = (NSData *)source;
parse = [[NSXMLParser alloc] initWithData:data];
}
break;
case ParseModeByURL:
{
NSURL *url = (NSURL *)source;
parse = [[NSXMLParser alloc] initWithContentsOfURL:url];

}
case ParseModeByXMLParser: {

parse = (NSXMLParser *)source;
}
break;
default:
break;
}

[self startWithParseInstance:parse];

}
- (void)startWithParseInstance:(NSXMLParser *)parse {

parse.delegate = self;
[parse parse];
}


#pragma mark - XML parse Delegate
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {

/* get the parent dictionary */
NSMutableDictionary *parentDict = [_elementStack lastObject];
NSObject *elementFound = [parentDict objectForKey:elementName];

/* if not exist */
if(!elementFound) {

NSMutableDictionary *childDict = [NSMutableDictionary new];
[parentDict setObject:childDict forKey:elementName];

[_elementStack addObject:childDict];

} else {/* exist this key, means this is array, not dictionary */

/* start from array */
if( [elementFound isKindOfClass:[NSMutableDictionary class]]) {

NSMutableArray *childs = [NSMutableArray new];
[childs addObject:elementFound];

[parentDict setObject:childs forKey:elementName];

[childs addObject:[NSMutableDictionary new]];
[_elementStack addObject:[childs lastObject]];
}

else {

/* continue from array */
NSMutableDictionary *childDict = [NSMutableDictionary new];
NSMutableArray *items = (NSMutableArray *)elementFound;

[items addObject:childDict];

[_elementStack addObject:childDict];

}
}

}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

/* has found the text */
if( [self.textGet length] > 0) {

[_elementStack removeLastObject];
NSMutableDictionary *item = [_elementStack lastObject];

[item setObject:_textGet forKey:elementName];
_textGet = [NSMutableString new];

} else {

[_elementStack removeLastObject];

if (_close) { // when open the <close in Array> mode

id value = [[_elementStack lastObject] valueForKey:elementName];
if ([value isKindOfClass:[NSDictionary class]]) {

NSMutableArray *arrayClose = [NSMutableArray array];
[arrayClose addObject:value];

[[_elementStack lastObject] setValue:arrayClose forKey:elementName];
}
}


}




}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

if([string hasPrefix:@"\n"])
return ;

[_textGet appendString:string];
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {

/* something error */
NSLog(@"%@", parseError);
}
- (void)parserDidStartDocument:(NSXMLParser *)parser
/* start to parse */
{

_elementStack = [NSMutableArray new];
_textGet = [NSMutableString new];

[_elementStack addObject:[NSMutableDictionary new]];
}

- (void)parserDidEndDocument:(NSXMLParser *)parser {
/* parse done */
NSLog(@"fater parse:\n %@", [_elementStack lastObject]);

NSDictionary *compeltedData = [_elementStack lastObject];

/* second dealing */
compeltedData = [self settingArrayClosed:compeltedData];

self.parseCompleteNow(compeltedData);
}

#pragma mark - Class Dead
- (void)dealloc {
NSLog(@"xml class dead");
}

#pragma mark - setting array closed
- (NSDictionary *)settingArrayClosed:(NSDictionary *)result {

/* first, find the main key */
NSString *key = [result allKeys][0];

/* second, start to close */
NSDictionary *start = @{ key : [result valueForKey:key][0] };

return start;
}

@end

预期的结果

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

data = (
{
"current_condition" = (
{
cloudcover = 16;
humidity = 59;
"observation_time" = "09:09 PM";
precipMM = "0.1";
pressure = 1010;
"temp_C" = 10;
"temp_F" = 49;
visibility = 10;
weatherCode = 113;
weatherDesc = (
{
value = Clear;
}
);
weatherIconUrl = (
{
value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0008_clear_sky_night.png";
}
);
winddir16Point = NW;
winddirDegree = 316;
windspeedKmph = 47;
windspeedMiles = 29;
}
);
request = (
{
query = "Lat 32.35 and Lon 141.43";
type = LatLon;
}
)
);
weather = (
{
date = "2013-01-15";
precipMM = "1.8";
tempMaxC = 12;
tempMaxF = 53;
tempMinC = 10;
tempMinF = 50;
weatherCode = 119;
weatherDesc = (
{
value = Cloudy;
}
);
weatherIconUrl = (
{
value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0003_white_cloud.png";
}
);
winddir16Point = NNW;
winddirDegree = 348;
winddirection = NNW;
windspeedKmph = 66;
windspeedMiles = 41;
},
{
date = "2013-01-16";
precipMM = "0.6";
tempMaxC = 13;
tempMaxF = 56;
tempMinC = 11;
tempMinF = 51;
weatherCode = 113;
weatherDesc = (
{
value = Sunny;
}
);
weatherIconUrl = (
{
value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png";
}
);
winddir16Point = WNW;
winddirDegree = 284;
winddirection = WNW;
windspeedKmph = 33;
windspeedMiles = 21;
},
{
date = "2013-01-17";
precipMM = "0.5";
tempMaxC = 14;
tempMaxF = 56;
tempMinC = 7;
tempMinF = 44;
weatherCode = 119;
weatherDesc = (
{
value = Cloudy;
}
);
weatherIconUrl = (
{
value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0003_white_cloud.png";
}
);
winddir16Point = WNW;
winddirDegree = 293;
winddirection = WNW;
windspeedKmph = 41;
windspeedMiles = 25;
},
{
date = "2013-01-18";
precipMM = "1.9";
tempMaxC = 11;
tempMaxF = 51;
tempMinC = 7;
tempMinF = 44;
weatherCode = 353;
weatherDesc = (
{
value = "Light rain shower";
}
);
weatherIconUrl = (
{
value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0009_light_rain_showers.png";
}
);
winddir16Point = NW;
winddirDegree = 312;
winddirection = NW;
windspeedKmph = 66;
windspeedMiles = 41;
},
{
date = "2013-01-19";
precipMM = "1.1";
tempMaxC = 7;
tempMaxF = 45;
tempMinC = 6;
tempMinF = 43;
weatherCode = 176;
weatherDesc = (
{
value = "Patchy rain nearby";
}
);
weatherIconUrl = (
{
value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0009_light_rain_showers.png";
}
);
winddir16Point = NW;
winddirDegree = 324;
winddirection = NW;
windspeedKmph = 52;
windspeedMiles = 32;
}
);
}
);
}
)

first_Blog

Core Data For IOS - 笔记

如果不能把一件事用简单的话说清楚, 那就表明你理解得还不够透彻。—– 阿尔伯特*爱因斯坦

Core Data:

  • Core Data 是一个框架, 是的开发者可以把数据当成对象来操作,而不必在乎数据在磁盘中的存储方式。

概念:

  • 托管对象(managed object): NSManagedObject 类或者子类。
    • Core Data 提供的数据对象
  • 持久化存储区(persistent store)
    • 磁盘内容区域
  • 托管对象模型
    • 把数据从托管对象映射到持久化存储区的作用
  • 托管对象上下文(managed object context)
    • 所有托管对象存放的地方
    • 托管对象上下文位于高速RAM中,有了托管对象上下文之后,对于原来需要读取磁盘才能获取的数据,现在只需访问这个上下文久可以了
    • 内存和磁盘的桥梁

托管对象持有一份对持久化存储区里相关数据的拷贝, 如果数据库作为持久化存储区,那么托管对象就是可能对应于数据库里某张数据表的一行。

持久化存储协调器(Persistent store coordinator)

  • 保存一份持久化存储区
  • 选用SQLite数据库作为持久化存储区
  • 可以有多个持久化存储区
  • 创建持久化存储区的类:NSPersistentStore
  • 创建持久化存储协调器的类:NSPersistentStoreCoordinator

托管对象模型(managed object model)

  • NSManagedObjectModel
  • 数据结构的描述或者图示
  • 类似于类,而不是对象实例
  • 托管对象是托管对象模型的实例

托管对象上下文

  • 包含多个托管对象

总结

  • NSManagedObject (托管对象)存放在 NSManagedObjectContext (托管对象上下文)
  • NSManagedObjectModel (托管对象模型) 作为托管对象实例的模版
  • NSPersistentStore (持久化存储区) 存放在 NSPersistentStoreCoordinator (持久化存储协调器) 中
  • NSManagedObjectContextNSPersistentStoreCoordinator 有联系
  • 所有对象模型绑定在持久化存储协调器
  • 可以通过模型的标示去获得实例或者直接在托管对象上下文操作数据