A dancing HTTP request framework base on AFNetworking 3.x for iOS & MacOS
- Promise
- Cache
- HTTPS
- Asynchronous Model Serializing
- Request Log convenient for Debug
- Request Exception Catching
- Add HTTP finder to your project.
- Add AFNetworking & YYCache to your podfile. (YYCache is a default cache service and you can use your own cache service by implementing CCCacheProtocol protocol, CocoaLumberjack is recommendatory Log framework but you can ignore it too)
Dancing with promice
// Start first request task.
SamplePHPRequest.new.promise.then(^id(id data){
// Get result(`Model` or `RawData`) finish by first task.
// Then start sencond request task within promise.
return SamplePHPRequest.new.promise;
},^id(CCResponseError *reason){
// If some bad things happend to first task you can catch it in this scope.
// But the error can't stop the promise chain.
// Exception(or some thing) will send to next promise(if exist) in return value.
return reason;
}).then(^id(id data){
// Got result(`Model` or `RawData` or `Exception`) finish by previous promise.
// Then start third request task within promise.
// The result finish by third task will not be deal by Fornt End (Just send to server whithout care succeed or not).
return [[[SamplePHPRequest new] bindRequestArgument:nil] promise];
},NULL);
// start primise chain
SamplePHPRequest.new.promise.next(^id(id data) {
// Get result(`Model` or `RawData`) finish by first promised task.
// These scope will never get errors.
CCLogInfo(@"%@",data);
// Send data to next node in promise chain encapsulated in return value
return data;
}).next(^id(id data){
// Get result finish by previous promised node.
// Then start third request task within promise.
return SamplePHPRequest.new.promise;
}).next(^id(id data) {
// Get result(`Model` or `RawData`) finish by previous promised node.
CCLogInfo(@"Promise chain succeed");
// Must return something, but will not sent to the `catch` node
return data;
}).catch(^(CCResponseError *reason) {
// If some bad things happend to `the whole promise chain`, you can catch it in this scope.
// Peomise chain will be interrupted when catching any exception,
// which meanse the rest of promise nodes will not be excuted forever.
CCLogError(@"Promise chain failed: %@",reason);
});
####Promise.all
[CCPromise all:@[SampleRequest.new.promise, SamplePHPRequest.new.promise]].then(^id(id data) {
// If all of the promsie succeed, you can catch their result in this scope.
// The data is an unordered array.
// Maybe Dictionary is more appropriate, the key is ordered by index in promises.
CCLogInfo(@"Get data: %@",data);
// Must return something.
// I want to optimize it, please send me any suggestions.
return CCPromise.fulfilled;
}, ^id(CCResponseError *reason) {
// If some bad things happend to `any promise in anof the promise`, you can catch it in this scope.
CCLogError(@"Catched Error: %@",reason);
return CCPromise.rejected;
});
####Normal Way
SamplePHPRequest *request = [SamplePHPRequest new];
[[request requestWithSuccess:^(id result, CCRequest *request) {
} failure:^(CCResponseError *error, CCRequest *request) {
CCLogInfo(@"Never invoke the callback if you cancel the request");
}] appendAccessory:self];
####Surported Cache Policy
typedef NS_ENUM(NSUInteger, CCRequestCachePolicy) {
// Request server immediately
CCRequestReloadRemoteDataIgnoringCacheData,
// Searching cache data first, return if hited data; otherwise request server data
CCRequestReturnCacheDataElseReloadRemoteData,
// Searching cache data first, invoke callbacks if hited data
// No matter succeed or not we request server data
CCRequestReturnCacheDataThenReloadRemoteData,
// Request server data first, searching cache data if failed
CCRequestReloadRemoteDataElseReturnCacheData,
};
// Cache Hitting Policy:
typedef NS_ENUM(NSUInteger, CCReturnCachePolicy) {
// hit by fire time
CCReturnCacheDataByFireTime,
// hit by revalidating fired time if exist
CCReloadRevalidatingCacheData
};
// Cache Write Policy:
typedef NS_ENUM(NSUInteger, CCDataCachePolicy) {
// Cache Models
// Implement NSCoding protocol if you use the default cache service
CCCachePolicyModel,
// Cache raw data
// JSON object for CCResponseSerializerTypeJSON
// RawData for CCResponseSerializerTypeRawData
CCCachePolicyRawData,
};
####Other advantages
- Surporting implement your request custom validator
- Surporting custom authorization or HTTP header
- Saving your time when facing to dazzling server frameworks
####Sample Codes
####Time to Fill knife
- Please check CCRequest for more details
- The most recommend way is creating your own Base Class recommend inheritedCCCacheRequest
- There are many places need to optimize.Welcome to create ISSUE or send me a emial. My original intention is resove
the vast majority of Networking Request
politely
, and I am eager for communicating with your design philosophy.
- Mock solution
CCRequest is release under the MIT license. See LICENSE for details.