如何改进iOS App的离线使用体验2

3.RestKit

官方网站:http://restkit.org/,Github开源项目,与 Restfull API 的 Web服务打交道,这个库非常便捷,它也提供了很完整的Cache机制。

Sample:

?
1
2
3
4
5
6
7
8
9
10
11
12
+ ( void )setCachePolicy:( BOOL )useCacheFirst
{
     RKObjectManager*objectManager = [RKObjectManager sharedManager];
     
     if  (useCacheFirst){
         objectManager.client.cachePolicy= RKRequestCachePolicyEnabled;  //使用本地Cache,如果没有Cache请求服务器
     }
     else
     {
         objectManager.client.cachePolicy=RKRequestCachePolicyLoadIfOffline|RKRequestCachePolicyTimeout;  //离线或者超时时使用本地Cache
     }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
+ ( BOOL )getHomeTimeline:(NSInteger)maxId
                  length:(NSInteger)length
                delegate:(id)delegate
           useCacheFirst:( BOOL )useCacheFirst
{
     if  (delegate== nil)
         return  NO;
     
     [iKnowAPIsetCachePolicy:useCacheFirst];
 
     //...
}

Cache请求只是RestKit最基本的功能,RestKit真正强大的地方在于处理与RESTful web services交互时的相关工作非常简便(https://github.com/RestKit/RestKit/wiki),RestKit还可以Cache data model到Core Data中:

Core Data support. Building on top of the object mapping layer, RestKit provides integration with Apple's Core Data framework. This support allows RestKit to persist remotely loaded objects directly back into a local store, either as a fast local cache or a primary data store that is periodically synced with the cloud. RestKit can populate Core Data associations for you, allowing natural property based traversal of your data model. It also provides a nice API on top of the Core Data primitives that simplifies configuration and querying use cases through an implementation of the Active Record access pattern.

但实际上RKRequestCachePolicy已经解决了大部分Cache需求。

 

4.SDWebImage

SDWebImage是Github开源项目:https://github.com/rs/SDWebImage,它用于方便的请求、Cache网络图片,并且请求完毕后交由UIImageView显示。

Asynchronous image downloader with cache support with an UIImageView category.

SDWebImage作为UIImageView的一个Category提供的,所以使用起来非常简单:

?
1
2
3
// Here we use the new provided setImageWithURL: method to load theweb image
[imageView setImageWithURL:[NSURLURLWithString:@ "http://www.domain.com/path/to/image.jpg" ]
                placeholderImage:[UIImageimageNamed:@ "placeholder.png" ]];

AFNetworking也提供了类似功能(UIImageView+AFNetworking):

?
1
2
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
[imageView setImageWithURL:[NSURLURLWithString:@ "http://i.imgur.com/r4uwx.jpg" ]placeholderImage:[UIImage imageNamed:@ "placeholder-avatar" ]];

 

5.UIWebView中的图片Cache

如果你使用UIWebView来展示内容,在离线情况下如果也想能显示的话需要实现2点:

  • Cache Html页面
  • Cache 图片等元素

使用上面介绍的网络组件来Cache Html页面比较便捷,之后使用webView loadHTMLString即可加载本地Html页面,而Cache图片需要更换NSURLCache公共实例为自定义的NSURLCache(UIWebView使用的即是+[NSURLCache sharedURLCache]):

?
1
2
3
4
5
//设置使用自定义Cache机制
LocalSubstitutionCache *cache = [[[LocalSubstitutionCache alloc]init] autorelease];
[cache setMemoryCapacity:4 * 1024 * 1024];
[cache setDiskCapacity:10 * 1024 * 1024];
[NSURLCache setSharedURLCache:cache];

自定义NSURLCache:

?
1
2
3
4
5
6
7
8
9
10
#import
 
@interface LocalSubstitutionCache : NSURLCache
{
     NSMutableDictionary*cachedResponses;
}
 
+ (NSString *)pathForURL:(NSURL*)url;
 
@end

详细的见NewsReader中的LocalSubstitutionCache.h/.m和WebViewController.m中的viewDidLoad,News Reader开源项目这里参考的是:http://cocoawithlove.com/2010/09/substituting-local-data-for-remote.html

 

NewsReader中的介绍

《iOS News Reader开源项目》这篇文章介绍到的开源项目改进了离线使用体验:

如何改进iOS App的离线使用体验2_第1张图片如何改进iOS App的离线使用体验2_第2张图片

在没有网络的情况下使用已经Cache过的所有数据:文章、图片、音频等等,用到的主要方案已经在上面介绍了,详细的请看源码:https://github.com/cubewang/NewsReader。

你可能感兴趣的:(如何改进iOS App的离线使用体验2)