IOS EMShop项目小结 (未完待续)

SVN资源修改后删除所有 .svn 相关信息方法:

      find ./ -name ".svn" -exec rm -r {} \;


1:XMLParse 第三方库

 

    谷歌的GDataXMLNode.h 和 GDataXMLNode.m 文件; 网上有很多这方面的介绍,就无需多言了。

     但是我们的项目需要,需要对其进行简单的修改,就是交换两个节点数据以及忽略节点的大小写敏感,这

    是该类所不支持的,所以对代码做了一些小修改,不过对于属性名大小写不敏感还不知道怎么修改,有知

    道的朋友请赐教,谢谢先,下面是我对代码做的小修改:

 

在GDataXMLNode.h 文件中加入一个 replaceChild 函数:

 

@interfaceGDataXMLElement :GDataXMLNode

 

- (id)initWithXMLString:(NSString*)str error:(NSError **)error;

 

- (NSArray *)namespaces;

- (void)setNamespaces:(NSArray*)namespaces;

- (void)addNamespace:(GDataXMLNode*)aNamespace;

 

// addChild adds a copy of the child node to theelement

- (void)addChild:(GDataXMLNode*)child;

- (void)removeChild:(GDataXMLNode*)child;

- (void)replaceChild:(GDataXMLNode*)old cur:(GDataXMLNode*)cur;//add by me

 

在GDataXMLNode.m文件中加入其实现代码:

 

- (void)replaceChild:(GDataXMLNode*)old cur:(GDataXMLNode*)cur{

    assert([oldkind] !=GDataXMLAttributeKind&& [curkind] != GDataXMLAttributeKind);   

   

    if (xmlNode_!=NULL&& cur != NULL && old!=NULL) {

       

        [selfreleaseCachedValues];

            

        xmlNodePtroldNode = [oldXMLNode];

        xmlNodePtrcurNodeCopy = [curXMLNodeCopy];

        if(curNodeCopy) {

           

            xmlNodePtrresultNode =xmlReplaceNode(oldNode, curNodeCopy);

            if(resultNode ==NULL) {

                

               // failed to add

               xmlFreeNode(curNodeCopy);

               

           } else {

               // added this child subtree successfully; see if it has

               // previously-unresolved namespace prefixes that can now befixed up

               //[[self class] fixUpNamespacesForNode:curNodeCopy

                                  //graftingToTreeNode:xmlNode_];

           }

        }

    }

}

 

调用端结点位置交换代码实现:

 

    GDataXMLElement*pos1Ele = (GDataXMLElement*)[arrGroupobjectAtIndex:pos1];

       GDataXMLElement*pos2Ele = (GDataXMLElement*)[arrGroupobjectAtIndex:pos2];

      [rootElement replaceChild:pos1Ele cur:pos2Ele];

       [rootElement replaceChild:pos2Elecur:pos1Ele];

 

忽略结点大小写敏感的代码修改(结点属性名的大小写忽略不知道怎么改,有知道的朋友请赐教

-    (NSArray*)elementsForName:(NSString *)name {

*   ****

       // if ([qName isEqual:name]){ //deleteit

                             if(NSOrderedSame==[qNamecompare:nameoptions:NSCaseInsensitiveSearch]){//add

 

 

中文出现乱码问题:

              就是在创建GDataXMLDocument之后马上调用其setCharacterEncoding这个函数,参数随便,库代码中没有对其处理,内部代码硬编码为UTF8String

staticxmlChar*GDataGetXMLString(NSString *str) {

    xmlChar*result = (xmlChar *)[strUTF8String];

    returnresult;

}

 

 

二:AFNetWorking 第三方网络库

0:为了方便;在工程的 –Prefix.pch文件中添加 #import"AFNetworking.h"

1:首先阅读下载的文档 readme.md文件。

2:  常用的使用方式在readme.md文件中都有描述,在这里提一下在使用该类库所遇到的一些问题。

*  :下载进度处理,需要将信息返回给UI,如何发送一个异步通知:

    dispatch_async(dispatch_get_main_queue(),^{

          /* handle */ //注意这段代码就是主线程来执行了(每个线程有其自己的数据栈)

       });

3: JSON数据返回问题:

    NSStringweatherUrl= @http://**”;

   

    NSURL*url = [NSURLURLWithString:weatherUrl];

    NSURLRequest*request = [NSURLRequestrequestWithURL:url];

   

    //[AFJSONRequestOperation addAcceptableContentTypes:[NSSetsetWithObject:@"text/html"]];

    AFJSONRequestOperation*operation =

    [AFJSONRequestOperationJSONRequestOperationWithRequest:request

        success:^(NSURLRequest*request,NSHTTPURLResponse *response,idJSON) {

NSLog(@"JSONRequestOperationWithRequestok, %@", [JSONdescription]);

        } failure:^(NSURLRequest*request,NSHTTPURLResponse *response,NSError*error,id JSON)  

                   {

          NSLog(@"failreason=%@", error.description);

        }];

     [operationstart];

在MRR 有 storyboard 的情况下将该上述代码放在 viewDidLoad中可以正常返回,

但是将上述代码放在MRR 但是没有 storyboard 的代码里面,在AFURLConnectionOperation里面下属代码就出现了错误。

+ (void)networkRequestThreadEntryPoint:(id)__unusedobject {

    do {

        @autoreleasepool {

           [[NSRunLoopcurrentRunLoop]run];//EXC_BAD_ACCESS (code=1, address=0xb06a9806)

        }

    } while (YES);

}

有时候还有返回 code 1061 错误:

Code=-1016 "Expected content type {(     "text/json",     "text/javascript",     "application/json")}, got text/html"

网上找了很多资料都是说:

[AFJSONRequestOperationaddAcceptableContentTypes:[NSSet setWithObject:@"text/html"]];

加上这么一行代码,但是我发现并不可以。不知道是为什么,后来一同事帮我用下面的方法实现json数据返回:

NSString(资源网址)->NSURLàNSData(json数据的二进制格式)—》NSJSONSerializationà返回可读的json数据格式:

 

NSString* reqURlString= stringUrl;

[FeixinEmShopgetInstance]_baseUrl],[versionstringValue]];

    NSURL*url = [NSURLURLWithString:reqURlString];

    NSData*jsonData = [[NSDataalloc]initWithContentsOfURL:url];//最重要的就是这个

    if(nil ==jsonData)

    {

        NSLog(@"error-theexpect result can't be responsed causing for the error url or nonstandard jsonformat, the url is %@", reqURlString);

        return ;

    }

    NSDictionary*dic;

    dic=  [NSJSONSerializationJSONObjectWithData:jsonDataoptions:NSJSONReadingMutableLeaveserror:nil];

    NSLog(@"%@",dic);

 

三:ZipArchive库

解压代码:如果dstPath没有创建,该库会自动创建, dstPath文件如果已经存在,overWrite:YES执行文件夹覆盖操作,文件会被重命名为后缀为_bak的文件名。

 

+(BOOL) unzip:(NSString*)dstPath:(NSString*)srcPath

{

    //实现解压操作

    assert(srcPath!=nil&& dstPath!=nil);

    ZipArchive* zip = [[ZipArchivealloc]init];

    if( [zipUnzipOpenFile:srcPath] )

    {

        BOOL ret = [zipUnzipFileTo:dstPathoverWrite:YES];

        if(NO==ret )

        {

            returnNO;

        }

        [zip UnzipCloseFile];

    }

    [zip release];

    returnYES;

}

 

四:IOS 文件读写

*在ios里面有一个沙盒的概念。

*Bundle是什么?

              Bundle其实就是资源,但是他是只读的。也就是存放在 {工程名}.app/{资源}

*每个app对应一个自己的Documents, 这里面可以存放网络上下载的资源。

 

本地html文件访问:

              NSURLfileURLWithPath:@http://**”;

网络html文件访问:

              [NSURLalloc]initWithString:@http://**”;

 

*获取应用程序的Documents目录方法:

+(NSString*)getDocumentDirectory

{

    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];

}

 

*读取Bundle文件目录方法:

NSString* srcAppPath= [[NSBundlemainBundle]bundlePath];

 

*创建目录,创建文件

[[NSFileManagerdefaultManager]createDirectoryAtPath:newDir];

[[NSFileManagerdefaultManager]createFileAtPath:newFile]

*删除目录或文件

[[NSFileManagerdefaultManager]removeItemAtPath:filePath/dirPath];

 

 

五:NSString常用方法 (包含本地文件及网络文件路径解析部分)

 

六:UIWebView 与 Javascript之间通信

          

七:网络优化方案

           通过将本地资源打包+资源自升级完成不常用资源的自动更新,实现本地资源的快速更新显示,对于动态经常变化的资源使用网络请求,改善用户体验。

 

八:中间考虑的问题:

1:页面切换——客户端通过UIWebView与页面交互,数据状态的考虑。

2:页面加载阶段与客户端对应控制时机:

主要有两个,页面首次加载及加载完成后注入javascript

对因的就是UIWebViewUIWebViewDelegate

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType

 

完成加载:

-    (void)webViewDidFinishLoad:(UIWebView*)webView

 

 3:进程间通信

             当一个进程进入后台后,是否还能有能力获取到通知;

             通过 URL Schema方式,进程间通信是否与数据量大小限制

 

   4: 文件的访问控制

   5: 版本发布是否能通过apple的审核,开发时需要注意什么?

   6:用户体验

*  多线程下载,断点续传,分页加载

*  网络加载改成本地资源加载

*  图标对于非透明图片将png改成jpg格式,png比jpg多了一份通道数据。

*  减少http连接请求,在网络状态不好的情况下,真机上需要占用4~5秒甚至更长的时间。

尽可能返回更多的数据。

*  对资源加密,下载后对资源解密,减少资源下载所需要的时间

*  用户对于非必要资源下载占用流量的考虑

             

   7:资源的md5加密。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值