iOS 网络请求Json自动转存到CoreData(一)

奉上地址一枚:GitHub 并自带demo~

项目需求:从网络获取Json后,将Json自动转存到CoreData中。

本次任务:对CoreData封装,完成基本的增删改查,多线程操作。



我们总是在跌跌撞撞中,不断成长。

CoreDataActivity.h

//
//  CoreDataActivity.h
//  QGLCoreDataPlugin
//
//  Created by Guicai.Li on 14-10-16.
//  Copyright (c) 2014年 Guicai Li. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "DEBUG.h"
#import "NSFetchRequest+helper.h"
#import "NSManagedObject+helper.h"
#import "NSManagedObjectModel+helper.h"
#import "NSPersistentStoreCoordinator+helper.h"

@import CoreData;

@interface CoreDataActivity : NSObject
// Parent Context
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
// Child Context
@property (strong, nonatomic) NSManagedObjectContext *childManagedObjectContext;

@property (strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

+ (CoreDataActivity *)shareInstance;

- (NSManagedObjectContext *)createChildManagedObjectContext;

- (void)saveContext;

- (void)deleteWithEntity:(NSString *)entityName attributeName:(NSString *)attributeName value:(id)value;

- (void)updateWithEntity:(NSString *)entityName attributeName:(NSString *)attributeName oldValue:(id)oldValue newValue:(id)newValue;

- (NSArray *)attributeForEntity:(NSString *)entityName;
- (NSArray *)attributeForEntity:(NSString *)entityName sortByAttributeName:(NSString *)sortDescriptorName;

@end


CoreDataActivity.m

//
//  CoreDataActivity.m
//  QGLCoreDataPlugin
//
//  Created by Guicai.Li on 14-10-16.
//  Copyright (c) 2014年 Guicai Li. All rights reserved.
//

// References:
// http://cutecoder.org/featured/asynchronous-core-data-document/
// http://www.touchwonders.com/fast-and-non-blocking-core-data-back-end-programming/

#import "CoreDataActivity.h"

#warning mark - Change your CoreDataFileName
#define CoreDataFileName @"QGLCoreDataPlugin"

static CoreDataActivity *coreDataActivity = nil;

@implementation CoreDataActivity

#pragma mark - SingleInstance
+ (CoreDataActivity *)shareInstance {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        coreDataActivity = [[CoreDataActivity alloc] init];
        [coreDataActivity initCoreData];
    });
    return coreDataActivity;
}

#pragma mark - Init for CoreData
- (void)initCoreData {
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator) {
        _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
        
        _childManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        [_childManagedObjectContext setParentContext:_managedObjectContext];
    }
}

#pragma mark - Creating the parent context
// Just create your
// NSManagedObjectModel
// and
// NSPersistentStoreCoordinator
// as before

// Initialize the parent
// NSManagedObjectContext
// by setting its concurrency type to
// NSMainQueueConcurrencyType

//Set the persistentStoreCoordinator of the newly created context
- (NSManagedObjectContext *)managedObjectContext {
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext;
}

- (NSManagedObjectModel *)managedObjectModel {
    NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSManagedObjectModel URLForManagedObjectModelName:CoreDataFileName]];
    return model;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    NSURL *storeURL = [NSPersistentStoreCoordinator URLForNSPersistentStoreCoordinatorName:CoreDataFileName];
    NSError *error = nil;
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        DLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
    return persistentStoreCoordinator;
}

#pragma mark - Creating the child context

// Create a new
// NSManagedObjectContext
// with concurrency type
// NSPrivateQueueConcurrencyType

// Set its parentContext (setParentContext:) to the above created
// NSManagedObjectContext

- (NSManagedObjectContext *)childManagedObjectContext {
    if (_childManagedObjectContext) {
        return _childManagedObjectContext;
    }
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator) {
        _childManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        [_childManagedObjectContext setPersistentStoreCoordinator:coordinator];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(childMergeChangesFromContextDidSaveNotification:) name:NSManagedObjectContextDidSaveNotification object:_childManagedObjectContext];
    }
    return _childManagedObjectContext;
}

- (void)childMergeChangesFromContextDidSaveNotification:(NSNotification *)notification
{
    DLog(@"ChildContext did save.");
    [self performSelectorOnMainThread:@selector(mainMergeChangesFromContextDidSaveNotification:)
                           withObject:notification
                        waitUntilDone:YES];
}

- (void)mainMergeChangesFromContextDidSaveNotification:(NSNotification *)notification {
    [[self managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];
}

- (NSManagedObjectContext *)createChildManagedObjectContext {
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    [context setParentContext:_managedObjectContext];
    return context;
}

#pragma mark -SaveContext
//MARK:Consider about synchronous or asynchronous
/*
 When you cannot guarantee to conform to thread confinement (or you just want to be sure). One can pass a block which does some heavy work using the desired managedObjectContext and Core Data will automatically schedule the block for execution and uses the correct thread. Depending on which function is called the operation will be synchronous (
 performBlockAndWait:
 ) or asynchronous (
 performBlock:
 ).
 */

- (void)saveContext {
//TODO:First sava childManagedObjectContext and then save the main Quene‘s managedObjectContext.

//    NSError *error = nil;
//    if ([_managedObjectContext hasChanges] && ![_managedObjectContext save:&error]) {
//        ELog(error);
//        abort();
//    }
    
//BETTER:It‘s better using performBlock rather than performBlockAndWait.Or you will wait for the block to be performed.
    [self.childManagedObjectContext performBlock:^{
        NSError *error = nil;
        [self.childManagedObjectContext save:&error];
        
        [self.managedObjectContext performBlock:^{
            NSError *parentError = nil;
            [self.managedObjectContext save:&parentError];
        }];
    }];
}

/*
 ========================================================================================================================
Things to remember:

After creating or modifying a
NSManagedObject
save to its managedObjectContext to keep everything in sync!
Objects created in one managedObjectContext cannot be used in another managedObjectContext without triggering an exception. Always convert them to the managedObjectContext you want to use them in. Check out the github link down below for some sample code.
 ========================================================================================================================
*/

// Normal Operation

- (void)deleteWithEntity:(NSString *)entityName attributeName:(NSString *)attributeName value:(id)value {
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K = %@", attributeName, value];
    NSFetchRequest *fetchRequst = [NSFetchRequest fetchRequestWithManagedObjectContext:self.managedObjectContext EntityName:entityName SortByAttributeName:attributeName Predicate:predicate];
    NSError *error = nil;
    NSArray *resultArray = [self.managedObjectContext executeFetchRequest:fetchRequst error:&error];
    if (error) {
        ELog(error);
    }
    if ([resultArray count]) {
        for (id obj in resultArray) {
            [self.managedObjectContext deleteObject:obj];
        }
    }
    [self saveContext];
}

- (void)updateWithEntity:(NSString *)entityName attributeName:(NSString *)attributeName oldValue:(id)oldValue newValue:(id)newValue {
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K = %@", attributeName, oldValue];
    NSFetchRequest *fetchRequst = [NSFetchRequest fetchRequestWithManagedObjectContext:self.managedObjectContext EntityName:entityName SortByAttributeName:attributeName Predicate:predicate];
    NSError *error = nil;
    NSArray *resultArray = [self.managedObjectContext executeFetchRequest:fetchRequst error:&error];
    if (error) {
        ELog(error);
    }
    if ([resultArray count]) {
        for (int i = 0; i < [resultArray count]; i ++) {
            [[resultArray objectAtIndex:i] setValue:newValue forKey:attributeName];
        }
    }
    [self saveContext];
}

- (NSArray *)attributeForEntity:(NSString *)entityName {
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:entityName];
    return [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
}

- (NSArray *)attributeForEntity:(NSString *)entityName sortByAttributeName:(NSString *)sortDescriptorName {
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithManagedObjectContext:self.managedObjectContext EntityName:entityName SortDescriptorName:sortDescriptorName];
    return [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
}

@end


对NSFetchRequest扩展:

NSFetchRequest+helper.h

//
//  NSFetchRequest+helper.h
//  QGLCoreDataPlugin
//
//  Created by Guicai.Li on 14-10-17.
//  Copyright (c) 2014年 Guicai Li. All rights reserved.
//

#import <Foundation/Foundation.h>
@import CoreData;

@interface NSFetchRequest (helper)

//TODO:

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName;

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName SortDescriptorName:(NSString *)sortDescriptorName;

//TODO:Using NSPredicate

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName Predicate:(NSPredicate *)predicate;

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName Predicate:(NSPredicate *)predicate Offset:(NSInteger)offset;

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName Predicate:(NSPredicate *)predicate Limit:(NSInteger)limit;

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName Predicate:(NSPredicate *)predicate Offset:(NSInteger)offset Limit:(NSInteger)limit;

//TODO:Using NSPredicate and SortDescriptorName

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName SortByAttributeName:(NSString *)sortDescriptorName Predicate:(NSPredicate *)predicate;

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName SortByAttributeName:(NSString *)sortDescriptorName Predicate:(NSPredicate *)predicate Offset:(NSInteger)offset;

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName SortByAttributeName:(NSString *)sortDescriptorName Predicate:(NSPredicate *)predicate Limit:(NSInteger)limit;

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName SortByAttributeName:(NSString *)sortDescriptorName Predicate:(NSPredicate *)predicate Offset:(NSInteger)offset Limit:(NSInteger)limit;
@end


NSFetchRequest+helper.m

//
//  NSFetchRequest+helper.m
//  QGLCoreDataPlugin
//
//  Created by Guicai.Li on 14-10-17.
//  Copyright (c) 2014年 Guicai Li. All rights reserved.
//

#import "NSFetchRequest+helper.h"

@implementation NSFetchRequest (helper)

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName {
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:contect];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:entity];
    
    [fetchRequest setReturnsObjectsAsFaults:NO];
    
    return fetchRequest;
}

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName SortDescriptorName:(NSString *)sortDescriptorName {
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithManagedObjectContext:contect EntityName:entityName];
    if (sortDescriptorName && ![sortDescriptorName isEqualToString:@""]) {
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortDescriptorName ascending:YES];
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
        [fetchRequest setSortDescriptors:sortDescriptors];
    }
    return fetchRequest;
}

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName Predicate:(NSPredicate *)predicate {
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithManagedObjectContext:contect EntityName:entityName];
    [fetchRequest setPredicate:predicate];
    return fetchRequest;
}

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName Predicate:(NSPredicate *)predicate Offset:(NSInteger)offset {
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithManagedObjectContext:contect EntityName:entityName Predicate:predicate];
    if (offset > 0) {
        [fetchRequest setFetchOffset:offset];
    }
    return fetchRequest;
}

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName Predicate:(NSPredicate *)predicate Limit:(NSInteger)limit {
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithManagedObjectContext:contect EntityName:entityName Predicate:predicate];
    if (limit > 0) {
        [fetchRequest setFetchLimit:limit];
    }
    return fetchRequest;
}

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName Predicate:(NSPredicate *)predicate Offset:(NSInteger)offset Limit:(NSInteger)limit {
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithManagedObjectContext:contect EntityName:entityName Predicate:predicate];
    if (offset > 0) {
        [fetchRequest setFetchOffset:offset];
    }
    if (limit > 0) {
        [fetchRequest setFetchLimit:limit];
    }
    return fetchRequest;
}

//TODO:Using NSPredicate and SortDescriptorName

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName SortByAttributeName:(NSString *)sortDescriptorName Predicate:(NSPredicate *)predicate {
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithManagedObjectContext:contect EntityName:entityName Predicate:predicate];
    if (sortDescriptorName && ![sortDescriptorName isEqualToString:@""]) {
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortDescriptorName ascending:YES];
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
        [fetchRequest setSortDescriptors:sortDescriptors];
    }
    return fetchRequest;
}

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName SortByAttributeName:(NSString *)sortDescriptorName Predicate:(NSPredicate *)predicate Offset:(NSInteger)offset {
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithManagedObjectContext:contect EntityName:entityName SortByAttributeName:sortDescriptorName Predicate:predicate];
    if (offset > 0) {
        [fetchRequest setFetchOffset:offset];
    }
    return fetchRequest;
}

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName SortByAttributeName:(NSString *)sortDescriptorName Predicate:(NSPredicate *)predicate Limit:(NSInteger)limit {
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithManagedObjectContext:contect EntityName:entityName SortByAttributeName:sortDescriptorName Predicate:predicate];
    if (limit > 0) {
        [fetchRequest setFetchLimit:limit];
    }
    return fetchRequest;
}

+ (NSFetchRequest *)fetchRequestWithManagedObjectContext:(NSManagedObjectContext *)contect EntityName:(NSString *)entityName SortByAttributeName:(NSString *)sortDescriptorName Predicate:(NSPredicate *)predicate Offset:(NSInteger)offset Limit:(NSInteger)limit {
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithManagedObjectContext:contect EntityName:entityName SortByAttributeName:sortDescriptorName Predicate:predicate];
    if (offset > 0) {
        [fetchRequest setFetchOffset:offset];
    }
    if (limit > 0) {
        [fetchRequest setFetchLimit:limit];
    }
    return fetchRequest;
}
@end


对NSManagedObject的扩展:

NSManagedObject+helper.h

//
//  NSManagedObject+helper.h
//  QGLCoreDataPlugin
//
//  Created by Guicai.Li on 14-10-16.
//  Copyright (c) 2014年 Guicai Li. All rights reserved.
//

#import <Foundation/Foundation.h>

@import CoreData;

@interface NSManagedObject (helper)

+ (id)createNSManagedObjectForName:(NSString *)name;

+ (void)deleteNSManagedObject:(id)object;

@end
//
//  NSManagedObject+helper.m
//  QGLCoreDataPlugin
//
//  Created by Guicai.Li on 14-10-16.
//  Copyright (c) 2014年 Guicai Li. All rights reserved.
//

#import "NSManagedObject+helper.h"
#import "CoreDataActivity.h"

@implementation NSManagedObject (helper)

+ (id)createNSManagedObjectForName:(NSString *)name {
//TODO:To judge whether the Main Thread. This is importmeng!
    CoreDataActivity *coreDateActivity = [CoreDataActivity shareInstance];
    NSManagedObjectContext *context = [NSThread mainThread] ? coreDateActivity.managedObjectContext : coreDateActivity.childManagedObjectContext;
    
    return [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:context];
}

+ (void)deleteNSManagedObject:(id)object {
    [[CoreDataActivity shareInstance].managedObjectContext deleteObject:object];
}

@end


对NSManagedObjectModel的扩展:

NSManagedObjectModel+helper.h

//
//  NSManagedObjectModel+helper.h
//  QGLCoreDataPlugin
//
//  Created by Guicai.Li on 14-10-16.
//  Copyright (c) 2014年 Guicai Li. All rights reserved.
//

#import <Foundation/Foundation.h>

@import CoreData;

@interface NSManagedObjectModel (helper)

+ (NSURL *)URLForManagedObjectModelName:(NSString *)modelName;

//+ (NSManagedObjectModel *)URLForMananagedObjectModel:(NSString *)urlStr;

@end
//
//  NSManagedObjectModel+helper.m
//  QGLCoreDataPlugin
//
//  Created by Guicai.Li on 14-10-16.
//  Copyright (c) 2014年 Guicai Li. All rights reserved.
//

#import "NSManagedObjectModel+helper.h"

@implementation NSManagedObjectModel (helper)

+ (NSURL *)URLForManagedObjectModelName:(NSString *)modelName {
    NSURL *modelUrl = [[NSBundle mainBundle] URLForResource:modelName withExtension:@"momd"];
    return modelUrl;
}

//+ (NSManagedObjectModel *)URLForMananagedObjectModel:(NSString *)urlStr {
//    NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSManagedObjectModel URLForManagedObjectModelName:urlStr]];
//    return model;
//}

@end


对NSPersistentStoreCoordinator的扩展:

NSPersistentStoreCoordinator+helper.h

//
//  NSPersistentStoreCoordinator+helper.h
//  QGLCoreDataPlugin
//
//  Created by Guicai.Li on 14-10-16.
//  Copyright (c) 2014年 Guicai Li. All rights reserved.
//

#import <Foundation/Foundation.h>

@import CoreData;

@interface NSPersistentStoreCoordinator (helper)

+ (NSURL *)URLForNSPersistentStoreCoordinatorName:(NSString *)fileName;

@end
//
//  NSPersistentStoreCoordinator+helper.m
//  QGLCoreDataPlugin
//
//  Created by Guicai.Li on 14-10-16.
//  Copyright (c) 2014年 Guicai Li. All rights reserved.
//

#import "NSPersistentStoreCoordinator+helper.h"

@implementation NSPersistentStoreCoordinator (helper)

+ (NSURL *)URLForNSPersistentStoreCoordinatorName:(NSString *)fileName {
    NSString *dbFileName = [NSString stringWithFormat:@"%@.sqlite", fileName];
    return [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:dbFileName];
}

@end
时间: 2024-07-29 08:50:12

iOS 网络请求Json自动转存到CoreData(一)的相关文章

iOS 网络请求Json自动转存到CoreData(二)

项目需求:从网络获取Json后,将Json自动转存到CoreData中. 继上一篇日志,那么这篇的主要内容是:将Json存到CoreData中. 说话实话,无非就是KVC赋值,思路清晰明了,但是我在想一个问题,有没有办法做到通用呢?那么问题来了-挖机技术哪家强! 好了不扯淡了,虽然KVC暂时满足我项目需求,那个通用办法我还在寻找中,能力有限,不过我会努力. 顺便分享一篇 讲述 这个网络请求数据存放到CoreData的介绍 Process remote service data into Core

ios网络请求3840错误的问题

ios网络请求3840错误的问题 by 伍雪颖 Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn't be completed. (Cocoa error 3840.)" (Unterminated string around character 11080.) UserInfo=0x171065d00 {NSDebugDescription=Unterminated string around charac

iOS网络请求框架:MKNetWorkKit的使用

MKNetWorkKit是由一个印度小伙子写的,是用于网络请求的库,支持ARC,我fork了一下,代码的网址这里给出. 本人fork作者代码地址(DoubleYi):https://github.com/DoubleYi/MKNetworkKit 作者源码地址(MugunthKumar):https://github.com/MugunthKumar/MKNetworkKit 作者关于类库介绍的地址(MugunthKumar):http://blog.mugunthkumar.com/produ

Android 网络请求json数据,解析json数据,生成对应的java bean类一步到位,快速开发

Android 网络请求一般都涉及到图片和JSON数据,怎样快速的请求网络JSON数据,解析JSON数据,并且一步生成自己想要的Java bean实体类?这个涉及到Android 开发效率的问题.由于接触Android 网络这方面比较多,自然就找到一些好的方法来快速开发Android 网络模块的相关内容,接下来就为大家揭晓 一步快速请求,解析JSON 数据生成对应的Java bean实体类的方法. 注:我们先把思路讲解下吧: 1.网络请求JSON数据代码可以自己写,当然我还是推荐使用网络上开源的

网络请求UI自动切换框架

1. 概述与分析 在实际项目中,我们不可避免的需要网络请求数据,由于网络或请求方式等主观或客观原因,导致我们请求的结果有时会出现一些偏差,从而导致我们UI界面显示也会有所不同.一般情况下,网络请求后我们的界面一般呈现三种页面状态:"正在加载中"."加载失败"和"加载成功".那么就可以通过网络请求后结果让UI界面自动切换, 2. 设计思路 通常情况下,正在加载和加载失败的界面都是相同的,只有加载成功后的界面不同.为了能让UI界面随着网络请求结果自动

iOS 网络请求NSURLSession

iOS 7 和 Mac OS X 10.9 Mavericks 中一个显著的变化就是对 Foundation URL 加载系统的彻底重构. 现在已经有人在深入苹果的网络层基础架构的地方做研究了,所以我想是时候来分享一些对于我对于这些新的 API 的看法和心得了,新的 API 将如何影响我们编写程序,以及它们对于 API 设计理念的影响. NSURLConnection 作为 Core Foundation / CFNetwork 框架的 API 之上的一个抽象,在 2003 年,随着第一版的 S

iOS 网络请求 笔记

有关网络请求的类(该图片来自:developer.apple.com) 一.url请求 网络请求的组成部分有服务器地址.请求参数,以及请求方式.在iOS中,一个网络请求用NSURLRequest(或者其子类NSURLMutableRequest)来表示. NSURLRequest适合于get请求,NSURLMutableRequest可以是post请求. get方式下,服务器地址和请求参数都可以明文包含在url中,可以直接使用这个url来创建NSURLRequest(或者NSURLMutable

造轮子 | 如何设计一个面向协议的 iOS 网络请求库

最近开源了一个面向协议设计的网络请求库 MBNetwork,基于 Alamofire 和 ObjectMapper 实现,目的是简化业务层的网络请求操作. 需要干些啥 对于大部分 App 而言,业务层做一次网络请求通常关心的问题有如下几个: 如何在任意位置发起网络请求. 表单创建.包含请求地址.请求方式(GET/POST/--).请求头等-- 加载遮罩.目的是阻塞 UI 交互,同时告知用户操作正在进行.比如提交表单时在提交按钮上显示 "菊花",同时使其失效. 加载进度展示.下载上传图片

swift 网络请求&amp;json解析

做实际项目总是离不开这两步,大多数情况下都是采用第三方框架来辅助完成,swift也不例外,由于swift并不成熟,用swift语言写的第三方框架很不稳定(苹果更新太快了),所幸swift和oc可以混编,所以本次使用的框架都是oc里面常用的.网络请求使用AFNetworking,json解析使用MJExtension. 下面开始正文: 1. swift中使用oc框架 其原理很简单,需要一个.h头文件,里面导入我们需要使用的oc框架的头文件,把这个.h文件配置到项目设置中即可 1).我们采取一个不容