diff --git a/README.md b/README.md new file mode 100644 index 0000000..4e6837f --- /dev/null +++ b/README.md @@ -0,0 +1,180 @@ + +# iAsync - a better dispatch_async() +iAsync is ***a set of IOS libraries*** that aims to make asychronous programming easy for for **Objective-C** developers. +It uses **functional programming** ideas to solve **Callback Hell** problem. + +It has been designed as a more convenient dispatch_async() with task dependencies and functional programming values in mind. + + +``` +License : BSD +Supports iOS versions 4.0 and higher. Builds using IOS SDK ver. 5.0 +``` +# Contacts + +* google group : +* skype chat (mostly, russian speaking) : + + +## Callback Hell Problem +You are suffering from the callback hell if you have a lot of nested asynchronous calls in your project. For example : +![Callback Hell](https://github.com/EmbeddedSources/iAsync/raw/master/readme/1-Callback-Hell.png) + + +This makes your code hard error prone. It is hard to debug and maintain such codebase. +There is a nice [blogpost](http://tirania.org/blog/archive/2013/Aug-15.html) and a [webinar](http://blog.xamarin.com/csharp-async-on-ios-and-android/) by [Miguel de Icaza](https://github.com/migueldeicaza) . + +Let's compare iAsync and the traditional approach + + +## Weather application core task +This library aims to provide a more convenient task scheduler. Its main advantage is more elegant processing of operations with dependencies. + +Let's consider an example weather application core. In order to get the weather by address we should perform the following actions : + +1. Query location from the geocoding service +2. Parse latitude and longitude data +3. Query weather using latitude and longitude data +4. Parse weather info +5. Update UI + + +### Traditional approach with dispatch_async() and AFNetworking +```objective-c + +NSString* geolocationUrl = [ NSString stringWithFormat: @"http://maps.googleapis.com/maps/api/geocode/json?sensor=true&address=%@", @"Kiev"]; + +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +[manager GET:geolocationUrl parameters:nil success:^(AFHTTPRequestOperation *operation, id jsonLocation) { + dispatch_async( myBackgroundQueue, ^{ + NSError* parseError; + + id parser = [ AWParserFactory jsonCoordinatesParser ]; + AWCoordinates* coordinates = [ parser parseData: jsonLocation + error: &parseError ]; + if ( !coordinates ) + { + [ self handleError: parseError ]; + } + + NSString* weatherUrl = [ NSString stringWithFormat: @"http://api.openweathermap.org/data/2.5/weather?lat=%1.2f&lon=%1.2f", coordinates.latitude, coordinates.longitude ]; + + + [manager GET:weatherUrl parameters:nil success:^(AFHTTPRequestOperation *operation, id jsonWeather) { + dispatch_async( myBackgroundQueue, ^{ + NSError* parseError; + id parser = [ AWParserFactory jsonWeatherParser ]; + AWWeatherInfo* weather = [ parser parseData: weatherJson + error: &parseError ]; + if ( !weather ) + { + [ self handleError: parseError ]; + } + + dispatch_async( dispatch_get_main_queue(), ^{ + [ self updateGuiWithWeatherInfo: weather ]; + }); + }); + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + [ self handleError: error ]; + }]; + }); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + [ self handleError: error ]; +}]; +``` + +As you can see, this code has 4 levels of nested callbacks and is hard to maitain. Let's see how iAsync will help you dealing with this complexity. + + + +### iAsync approach +Using **iAsync** you can rewrite the code above in functional programming manner. In our example we use a waterfall flow that ensures execution order and passes results of the previous asynchronous function to the one being executed. + +![Waterfall flow](https://github.com/EmbeddedSources/iAsync/raw/master/readme/2-Waterfall.png) + + +So, the code above can be rewritten in a declarative manner : + +```objective-c ++(JFFAsyncOperation)asyncWeatherForAddress:( NSString* )userInput +{ + return bindSequenceOfAsyncOperationsArray + ( + [ self asyncLocationForAddress: userInput ], + @[ + [ self parseRawAddressBinder ], + [ self getWeatherBinder ], + [ self parseWeatherBinder ] + ] + ); +} +``` + +And it is as easy to use as built-in dispatch_async() routines : + +```objective-c +-(IBAction)getWeatherButtonTapped:(id)sender +{ + [ self.txtAddress resignFirstResponder ]; + + NSString* address = self.txtAddress.text; + if ( ![ self validateAddress: address ] ) + { + // Handle validation error and show alert + return; + } + + + JFFAsyncOperation loader = [ AWOperationsFactory asyncWeatherForAddress: address ]; + + + __weak ESViewController* weakSelf = self; + JFFCancelAsyncOperationHandler onCancel = ^void(BOOL isOperationKeepGoing) + { + [ weakSelf onWeatherInfoRequestCancelled ]; + }; + JFFDidFinishAsyncOperationHandler onLoaded = ^void(id result, NSError *error) + { + [ weakSelf onWeatherInfoLoaded: result + withError: error ]; + }; + JFFCancelAsyncOperation cancelLoad = loader( nil, onCancel, onLoaded ); + self->_cancelLoad = cancelLoad; + + self.activityIndicator.hidden = NO; + [ self.activityIndicator startAnimating ]; +} + +-(IBAction)cancelButtonTapped:(id)sender +{ + if ( nil != self->_cancelLoad ) + { + self->_cancelLoad( YES ); + } + + [ self.activityIndicator stopAnimating ]; + self.activityIndicator.hidden = YES; + self.resultView.hidden = YES; +} + +``` + + +Of course, we should implement download and parsing routines. Full source code of the [sample](https://github.com/dodikk/weather-iasync/blob/master/lib/iAsyncWeatherOperations/iAsyncWeatherOperations/AWOperationsFactory.mm) can be found at the repository below : + + +## iAsync flow control operators +iAsync has the following flow control for operations for your asynchronous blocks : + +* **sequence** - operations are executed one after another. +* **sequence of attempts** - operations are executed one after another until one of them succeeds +* **group** - operations are executed in parallel. A single callback is triggered when all of them are finished. +* **waterfall** - operations are executed one after another. Results of the previous operation are passed to the one under execution as input. + + +The library has many more features to explore. See the readme in the "lib" directory for details. + + +[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/EmbeddedSources/iasync/trend.png)](https://bitdeli.com/free "Bitdeli Badge") + diff --git a/app/ImageCacheExample/ImageCacheExample.xcodeproj/project.pbxproj b/app/ImageCacheExample/ImageCacheExample.xcodeproj/project.pbxproj index 1fa7b52..bba3684 100644 --- a/app/ImageCacheExample/ImageCacheExample.xcodeproj/project.pbxproj +++ b/app/ImageCacheExample/ImageCacheExample.xcodeproj/project.pbxproj @@ -40,6 +40,20 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 4C0C3F291826DD6300984027 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = CEE23437160882F800B34AD8 /* JFFAsyncOperations.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 4C1A0F8D182577BE0020FBF6; + remoteInfo = JFFAsyncOperationsMacOS; + }; + 4C0C3F301826DD6300984027 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = CEE233EB160882DA00B34AD8 /* JFFRestKit.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 4C043A4A181E9D8200246A88; + remoteInfo = JFFRestKitTests; + }; CE102F3B16089E13004229C5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = CEE233EB160882DA00B34AD8 /* JFFRestKit.xcodeproj */; @@ -448,7 +462,7 @@ isa = PBXGroup; children = ( CEE233D6160882CB00B34AD8 /* libJFFUI.a */, - CEE233D8160882CB00B34AD8 /* libJFFUI copy.a */, + CEE233D8160882CB00B34AD8 /* libJFFUI-clang.a */, ); name = Products; sourceTree = ""; @@ -468,6 +482,7 @@ isa = PBXGroup; children = ( CEE233F8160882DB00B34AD8 /* libJFFRestKit.a */, + 4C0C3F311826DD6300984027 /* JFFRestKitTests.xctest */, ); name = Products; sourceTree = ""; @@ -487,7 +502,7 @@ isa = PBXGroup; children = ( CEE23421160882EA00B34AD8 /* libJFFJsonTools.a */, - CEE23423160882EA00B34AD8 /* JFFJsonToolsTests.octest */, + CEE23423160882EA00B34AD8 /* JFFJsonToolsTests.xctest */, ); name = Products; sourceTree = ""; @@ -506,6 +521,7 @@ CEE2343E160882F800B34AD8 /* libJFFAsyncOperations.a */, CEE23440160882F800B34AD8 /* libJFFAsyncOperations-clang.a */, CEE23442160882F800B34AD8 /* JFFAsyncOperationsFW.framework */, + 4C0C3F2A1826DD6300984027 /* libJFFAsyncOperationsMacOS.a */, ); name = Products; sourceTree = ""; @@ -628,6 +644,20 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ + 4C0C3F2A1826DD6300984027 /* libJFFAsyncOperationsMacOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libJFFAsyncOperationsMacOS.a; + remoteRef = 4C0C3F291826DD6300984027 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 4C0C3F311826DD6300984027 /* JFFRestKitTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = JFFRestKitTests.xctest; + remoteRef = 4C0C3F301826DD6300984027 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; CEE233C4160882C500B34AD8 /* libJFFUtils.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -670,10 +700,9 @@ remoteRef = CEE233D5160882CB00B34AD8 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - CEE233D8160882CB00B34AD8 /* libJFFUI copy.a */ = { + CEE233D8160882CB00B34AD8 /* libJFFUI-clang.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; - name = "libJFFUI copy.a"; path = "libJFFUI-clang.a"; remoteRef = CEE233D7160882CB00B34AD8 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; @@ -748,10 +777,10 @@ remoteRef = CEE23420160882EA00B34AD8 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - CEE23423160882EA00B34AD8 /* JFFJsonToolsTests.octest */ = { + CEE23423160882EA00B34AD8 /* JFFJsonToolsTests.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = JFFJsonToolsTests.octest; + path = JFFJsonToolsTests.xctest; remoteRef = CEE23422160882EA00B34AD8 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -934,7 +963,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -952,7 +980,10 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ../../lib; + HEADER_SEARCH_PATHS = ( + ../../lib, + ../../lib/JFFCache, + ); IPHONEOS_DEPLOYMENT_TARGET = 5.1; OTHER_LDFLAGS = "-all_load"; SDKROOT = iphoneos; @@ -964,7 +995,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -975,7 +1005,10 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ../../lib; + HEADER_SEARCH_PATHS = ( + ../../lib, + ../../lib/JFFCache, + ); IPHONEOS_DEPLOYMENT_TARGET = 5.1; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_LDFLAGS = "-all_load"; diff --git a/app/ImageCacheExample/ImageCacheExample/ImageCacheExample-Prefix.pch b/app/ImageCacheExample/ImageCacheExample/ImageCacheExample-Prefix.pch index 81f4472..0515be8 100644 --- a/app/ImageCacheExample/ImageCacheExample/ImageCacheExample-Prefix.pch +++ b/app/ImageCacheExample/ImageCacheExample/ImageCacheExample-Prefix.pch @@ -11,7 +11,8 @@ #ifdef __OBJC__ #import #import - + #import + #import #import #endif diff --git a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBAppLinkData.h b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBAppLinkData.h index 9680634..dfdcd2e 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBAppLinkData.h +++ b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBAppLinkData.h @@ -31,7 +31,13 @@ @property (readonly) NSArray *actionIDs; /*! @abstract Reference breadcrumb provided during creation of story */ -@property (readonly) NSArray *ref; +@property (readonly) NSString *ref; + +/*! @abstract User Agent string set by the referer */ +@property (readonly) NSString *userAgent; + +/*! @abstract Referer data is a JSON object set by the referer with referer-specific content */ +@property (readonly) NSDictionary *refererData; /*! @abstract Full set of query parameters for this app link */ @property (readonly) NSDictionary *originalQueryParameters; diff --git a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBDialogs.h b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBDialogs.h index d002e94..1d84796 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBDialogs.h +++ b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBDialogs.h @@ -201,7 +201,7 @@ NSError *error); /*! @abstract - Determines whether a call to presentFBShareDialogWithTarget: will successfully + Determines whether a call to presentShareDialogWithTarget: will successfully present a dialog in the Facebook application. This is useful for applications that need to modify the available UI controls depending on whether the dialog is available on the current platform. @@ -211,7 +211,7 @@ NSError *error); @return YES if the dialog would be presented, and NO if not @discussion A return value of YES here indicates that the corresponding - presentFBShareDialogWithParams method will return a non-nil FBAppCall for the same + presentShareDialogWithParams method will return a non-nil FBAppCall for the same params. And vice versa. */ + (BOOL)canPresentShareDialogWithParams:(FBShareDialogParams *)params; @@ -244,7 +244,7 @@ NSError *error); FBAppCallCompletionHandler. @discussion A non-nil FBAppCall object is only returned if the corresponding - canPresetFBShareDialogWithParams method is also returning YES for the same params. + canPresentShareDialogWithParams method is also returning YES for the same params. */ + (FBAppCall *)presentShareDialogWithParams:(FBShareDialogParams *)params clientState:(NSDictionary *)clientState @@ -274,7 +274,7 @@ NSError *error); FBAppCallCompletionHandler. @discussion A non-nil FBAppCall object is only returned if the corresponding - canPresetFBShareDialogWithParams method is also returning YES for the same params. + canPresentShareDialogWithParams method is also returning YES for the same params. */ + (FBAppCall *)presentShareDialogWithLink:(NSURL *)link handler:(FBDialogAppCallCompletionHandler)handler; @@ -305,7 +305,7 @@ NSError *error); FBAppCallCompletionHandler. @discussion A non-nil FBAppCall object is only returned if the corresponding - canPresetFBShareDialogWithParams method is also returning YES for the same params. + canPresentShareDialogWithParams method is also returning YES for the same params. */ + (FBAppCall *)presentShareDialogWithLink:(NSURL *)link name:(NSString *)name @@ -347,7 +347,7 @@ NSError *error); FBAppCallCompletionHandler. @discussion A non-nil FBAppCall object is only returned if the corresponding - canPresetFBShareDialogWithParams method is also returning YES for the same params. + canPresentShareDialogWithParams method is also returning YES for the same params. */ + (FBAppCall *)presentShareDialogWithLink:(NSURL *)link name:(NSString *)name @@ -359,7 +359,7 @@ NSError *error); /*! @abstract - Determines whether a call to presentFBShareDialogWithOpenGraphActionParams:clientState:handler: + Determines whether a call to presentShareDialogWithOpenGraphActionParams:clientState:handler: will successfully present a dialog in the Facebook application. This is useful for applications that need to modify the available UI controls depending on whether the dialog is available on the current platform. @@ -369,7 +369,7 @@ NSError *error); @return YES if the dialog would be presented, and NO if not @discussion A return value of YES here indicates that the corresponding - presentFBShareDialogWithOpenGraphActionParams method will return a non-nil FBAppCall for + presentShareDialogWithOpenGraphActionParams method will return a non-nil FBAppCall for the same params. And vice versa. */ + (BOOL)canPresentShareDialogWithOpenGraphActionParams:(FBOpenGraphActionShareDialogParams *)params; @@ -402,7 +402,7 @@ NSError *error); FBAppCallCompletionHandler. @discussion A non-nil FBAppCall object is only returned if the corresponding - canPresentFBShareDialogWithOpenGraphActionParams method is also returning YES for the same params. + canPresentShareDialogWithOpenGraphActionParams method is also returning YES for the same params. */ + (FBAppCall *)presentShareDialogWithOpenGraphActionParams:(FBOpenGraphActionShareDialogParams *)params clientState:(NSDictionary *)clientState @@ -439,7 +439,7 @@ NSError *error); FBAppCallCompletionHandler. @discussion A non-nil FBAppCall object is only returned if the corresponding - canPresentFBShareDialogWithOpenGraphActionParams method is also returning YES for the same params. + canPresentShareDialogWithOpenGraphActionParams method is also returning YES for the same params. */ + (FBAppCall *)presentShareDialogWithOpenGraphAction:(id)action actionType:(NSString *)actionType @@ -481,7 +481,7 @@ NSError *error); FBAppCallCompletionHandler. @discussion A non-nil FBAppCall object is only returned if the corresponding - canPresentFBShareDialogWithOpenGraphActionParams method is also returning YES for the same params. + canPresentShareDialogWithOpenGraphActionParams method is also returning YES for the same params. */ + (FBAppCall *)presentShareDialogWithOpenGraphAction:(id)action actionType:(NSString *)actionType diff --git a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBError.h b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBError.h index c351428..70ef2a4 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBError.h +++ b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBError.h @@ -118,6 +118,11 @@ typedef enum FBErrorCode { The operation failed because the session is currently busy reconnecting. */ FBErrorSessionReconnectInProgess, + + /*! + Reserved for future use. + */ + FBErrorOperationDisallowedForRestrictedTreament, } FBErrorCode; /*! diff --git a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBFriendPickerViewController.h b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBFriendPickerViewController.h index c696353..6c8af5b 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBFriendPickerViewController.h +++ b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBFriendPickerViewController.h @@ -125,8 +125,13 @@ typedef enum { @abstract The list of friends that are currently selected in the veiw. The items in the array are objects. + + @discussion + You can set this this array to pre-select items in the picker. The objects in the array + must be complete id objects (i.e., fetched from a Graph query or from a + previous picker's selection, with id and appropriate name fields). */ -@property (nonatomic, retain, readonly) NSArray *selection; +@property (nonatomic, copy) NSArray *selection; /*! @abstract diff --git a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBLoginDialog.h b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBLoginDialog.h index cda7369..5f8f5b5 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBLoginDialog.h +++ b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBLoginDialog.h @@ -39,7 +39,7 @@ @protocol FBLoginDialogDelegate -- (void)fbDialogLogin:(NSString*)token expirationDate:(NSDate*)expirationDate; +- (void)fbDialogLogin:(NSString*)token expirationDate:(NSDate*)expirationDate params:(NSDictionary *)params; - (void)fbDialogNotLogin:(BOOL)cancelled; diff --git a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBLoginView.h b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBLoginView.h index 5a1c424..4f75e3a 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBLoginView.h +++ b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBLoginView.h @@ -69,6 +69,15 @@ */ @property (nonatomic, assign) FBSessionDefaultAudience defaultAudience; +/*! + @abstract + The login behavior for the active session if the user logs in via this view + + @discussion + The default value is FBSessionLoginBehaviorUseSystemAccountIfPresent. + */ +@property (nonatomic) FBSessionLoginBehavior loginBehavior; + /*! @abstract diff --git a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBRequest.h b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBRequest.h index a6ec08d..187bd7a 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBRequest.h +++ b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBRequest.h @@ -526,6 +526,9 @@ typedef NSUInteger FBRequestState __attribute__((deprecated)); @param graphPath The Graph API endpoint to use for the request, for example "me". @param graphObject An object or open graph action to post. + + @discussion This method is typically used for posting an open graph action. If you are only + posting an open graph object (without an action), consider using `requestForPostOpenGraphObject:` */ + (FBRequest *)requestForPostWithGraphPath:(NSString*)graphPath graphObject:(id)graphObject; diff --git a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBRequestConnection.h b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBRequestConnection.h index a8c2c9a..140267f 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBRequestConnection.h +++ b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBRequestConnection.h @@ -490,7 +490,10 @@ typedef void (^FBRequestHandler)(FBRequestConnection *connection, @param graphObject An object or open graph action to post. @param handler The handler block to call when the request completes with a success, error, or cancel action. - */ + + @discussion This method is typically used for posting an open graph action. If you are only + posting an open graph object (without an action), consider using `startForPostOpenGraphObject:completionHandler:` +*/ + (FBRequestConnection*)startForPostWithGraphPath:(NSString*)graphPath graphObject:(id)graphObject completionHandler:(FBRequestHandler)handler; diff --git a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBSettings.h b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBSettings.h index b38a3aa..a9fc57b 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBSettings.h +++ b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FBSettings.h @@ -63,13 +63,25 @@ typedef void (^FBInstallResponseDataHandler)(FBGraphObject *response, NSError *e in release builds. */ typedef enum : NSUInteger { - FBBetaFeaturesNone = 0, + FBBetaFeaturesNone = 0, #if defined(DEBUG) || defined(FB_BUILD_ONLY) - FBBetaFeaturesShareDialog = 1 << 0, - FBBetaFeaturesOpenGraphShareDialog = 1 << 1, + FBBetaFeaturesShareDialog = 1 << 0, + FBBetaFeaturesOpenGraphShareDialog = 1 << 1, #endif } FBBetaFeatures; +/*! + @typedef + @abstract Indicates if this app should be restricted + */ +typedef NS_ENUM(NSUInteger, FBRestrictedTreatment) { + /*! The default treatment indicating the app is not restricted. */ + FBRestrictedTreatmentNO = 0, + + /*! Indicates the app is restricted. */ + FBRestrictedTreatmentYES = 1 +}; + @interface FBSettings : NSObject /*! @@ -296,7 +308,7 @@ typedef enum : NSUInteger { /*! @method - + @abstract Gets whether data such as that generated through FBAppEvents and sent to Facebook should be restricted from being used for other than analytics and conversions. Defaults to NO. This value is stored on the device and persists across app launches. */ @@ -304,10 +316,10 @@ typedef enum : NSUInteger { /*! @method - + @abstract Sets whether data such as that generated through FBAppEvents and sent to Facebook should be restricted from being used for other than analytics and conversions. Defaults to NO. This value is stored on the device and persists across app launches. - + @param limitEventAndDataUsage The desired value. */ + (void)setLimitEventAndDataUsage:(BOOL)limitEventAndDataUsage; diff --git a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FacebookSDK.h b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FacebookSDK.h index 3fb4b5f..68425e9 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FacebookSDK.h +++ b/frameworks/FacebookSDK.framework/Versions/A/DeprecatedHeaders/FacebookSDK.h @@ -135,5 +135,5 @@ */ -#define FB_IOS_SDK_VERSION_STRING @"3.9.0" +#define FB_IOS_SDK_VERSION_STRING @"3.11.0" diff --git a/frameworks/FacebookSDK.framework/Versions/A/FacebookSDK b/frameworks/FacebookSDK.framework/Versions/A/FacebookSDK index ca2cc85..38ff422 100644 Binary files a/frameworks/FacebookSDK.framework/Versions/A/FacebookSDK and b/frameworks/FacebookSDK.framework/Versions/A/FacebookSDK differ diff --git a/frameworks/FacebookSDK.framework/Versions/A/Headers/FBAppLinkData.h b/frameworks/FacebookSDK.framework/Versions/A/Headers/FBAppLinkData.h index 9680634..dfdcd2e 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/Headers/FBAppLinkData.h +++ b/frameworks/FacebookSDK.framework/Versions/A/Headers/FBAppLinkData.h @@ -31,7 +31,13 @@ @property (readonly) NSArray *actionIDs; /*! @abstract Reference breadcrumb provided during creation of story */ -@property (readonly) NSArray *ref; +@property (readonly) NSString *ref; + +/*! @abstract User Agent string set by the referer */ +@property (readonly) NSString *userAgent; + +/*! @abstract Referer data is a JSON object set by the referer with referer-specific content */ +@property (readonly) NSDictionary *refererData; /*! @abstract Full set of query parameters for this app link */ @property (readonly) NSDictionary *originalQueryParameters; diff --git a/frameworks/FacebookSDK.framework/Versions/A/Headers/FBDialogs.h b/frameworks/FacebookSDK.framework/Versions/A/Headers/FBDialogs.h index d002e94..1d84796 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/Headers/FBDialogs.h +++ b/frameworks/FacebookSDK.framework/Versions/A/Headers/FBDialogs.h @@ -201,7 +201,7 @@ NSError *error); /*! @abstract - Determines whether a call to presentFBShareDialogWithTarget: will successfully + Determines whether a call to presentShareDialogWithTarget: will successfully present a dialog in the Facebook application. This is useful for applications that need to modify the available UI controls depending on whether the dialog is available on the current platform. @@ -211,7 +211,7 @@ NSError *error); @return YES if the dialog would be presented, and NO if not @discussion A return value of YES here indicates that the corresponding - presentFBShareDialogWithParams method will return a non-nil FBAppCall for the same + presentShareDialogWithParams method will return a non-nil FBAppCall for the same params. And vice versa. */ + (BOOL)canPresentShareDialogWithParams:(FBShareDialogParams *)params; @@ -244,7 +244,7 @@ NSError *error); FBAppCallCompletionHandler. @discussion A non-nil FBAppCall object is only returned if the corresponding - canPresetFBShareDialogWithParams method is also returning YES for the same params. + canPresentShareDialogWithParams method is also returning YES for the same params. */ + (FBAppCall *)presentShareDialogWithParams:(FBShareDialogParams *)params clientState:(NSDictionary *)clientState @@ -274,7 +274,7 @@ NSError *error); FBAppCallCompletionHandler. @discussion A non-nil FBAppCall object is only returned if the corresponding - canPresetFBShareDialogWithParams method is also returning YES for the same params. + canPresentShareDialogWithParams method is also returning YES for the same params. */ + (FBAppCall *)presentShareDialogWithLink:(NSURL *)link handler:(FBDialogAppCallCompletionHandler)handler; @@ -305,7 +305,7 @@ NSError *error); FBAppCallCompletionHandler. @discussion A non-nil FBAppCall object is only returned if the corresponding - canPresetFBShareDialogWithParams method is also returning YES for the same params. + canPresentShareDialogWithParams method is also returning YES for the same params. */ + (FBAppCall *)presentShareDialogWithLink:(NSURL *)link name:(NSString *)name @@ -347,7 +347,7 @@ NSError *error); FBAppCallCompletionHandler. @discussion A non-nil FBAppCall object is only returned if the corresponding - canPresetFBShareDialogWithParams method is also returning YES for the same params. + canPresentShareDialogWithParams method is also returning YES for the same params. */ + (FBAppCall *)presentShareDialogWithLink:(NSURL *)link name:(NSString *)name @@ -359,7 +359,7 @@ NSError *error); /*! @abstract - Determines whether a call to presentFBShareDialogWithOpenGraphActionParams:clientState:handler: + Determines whether a call to presentShareDialogWithOpenGraphActionParams:clientState:handler: will successfully present a dialog in the Facebook application. This is useful for applications that need to modify the available UI controls depending on whether the dialog is available on the current platform. @@ -369,7 +369,7 @@ NSError *error); @return YES if the dialog would be presented, and NO if not @discussion A return value of YES here indicates that the corresponding - presentFBShareDialogWithOpenGraphActionParams method will return a non-nil FBAppCall for + presentShareDialogWithOpenGraphActionParams method will return a non-nil FBAppCall for the same params. And vice versa. */ + (BOOL)canPresentShareDialogWithOpenGraphActionParams:(FBOpenGraphActionShareDialogParams *)params; @@ -402,7 +402,7 @@ NSError *error); FBAppCallCompletionHandler. @discussion A non-nil FBAppCall object is only returned if the corresponding - canPresentFBShareDialogWithOpenGraphActionParams method is also returning YES for the same params. + canPresentShareDialogWithOpenGraphActionParams method is also returning YES for the same params. */ + (FBAppCall *)presentShareDialogWithOpenGraphActionParams:(FBOpenGraphActionShareDialogParams *)params clientState:(NSDictionary *)clientState @@ -439,7 +439,7 @@ NSError *error); FBAppCallCompletionHandler. @discussion A non-nil FBAppCall object is only returned if the corresponding - canPresentFBShareDialogWithOpenGraphActionParams method is also returning YES for the same params. + canPresentShareDialogWithOpenGraphActionParams method is also returning YES for the same params. */ + (FBAppCall *)presentShareDialogWithOpenGraphAction:(id)action actionType:(NSString *)actionType @@ -481,7 +481,7 @@ NSError *error); FBAppCallCompletionHandler. @discussion A non-nil FBAppCall object is only returned if the corresponding - canPresentFBShareDialogWithOpenGraphActionParams method is also returning YES for the same params. + canPresentShareDialogWithOpenGraphActionParams method is also returning YES for the same params. */ + (FBAppCall *)presentShareDialogWithOpenGraphAction:(id)action actionType:(NSString *)actionType diff --git a/frameworks/FacebookSDK.framework/Versions/A/Headers/FBError.h b/frameworks/FacebookSDK.framework/Versions/A/Headers/FBError.h index c351428..70ef2a4 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/Headers/FBError.h +++ b/frameworks/FacebookSDK.framework/Versions/A/Headers/FBError.h @@ -118,6 +118,11 @@ typedef enum FBErrorCode { The operation failed because the session is currently busy reconnecting. */ FBErrorSessionReconnectInProgess, + + /*! + Reserved for future use. + */ + FBErrorOperationDisallowedForRestrictedTreament, } FBErrorCode; /*! diff --git a/frameworks/FacebookSDK.framework/Versions/A/Headers/FBFriendPickerViewController.h b/frameworks/FacebookSDK.framework/Versions/A/Headers/FBFriendPickerViewController.h index c696353..6c8af5b 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/Headers/FBFriendPickerViewController.h +++ b/frameworks/FacebookSDK.framework/Versions/A/Headers/FBFriendPickerViewController.h @@ -125,8 +125,13 @@ typedef enum { @abstract The list of friends that are currently selected in the veiw. The items in the array are objects. + + @discussion + You can set this this array to pre-select items in the picker. The objects in the array + must be complete id objects (i.e., fetched from a Graph query or from a + previous picker's selection, with id and appropriate name fields). */ -@property (nonatomic, retain, readonly) NSArray *selection; +@property (nonatomic, copy) NSArray *selection; /*! @abstract diff --git a/frameworks/FacebookSDK.framework/Versions/A/Headers/FBLoginView.h b/frameworks/FacebookSDK.framework/Versions/A/Headers/FBLoginView.h index 5a1c424..4f75e3a 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/Headers/FBLoginView.h +++ b/frameworks/FacebookSDK.framework/Versions/A/Headers/FBLoginView.h @@ -69,6 +69,15 @@ */ @property (nonatomic, assign) FBSessionDefaultAudience defaultAudience; +/*! + @abstract + The login behavior for the active session if the user logs in via this view + + @discussion + The default value is FBSessionLoginBehaviorUseSystemAccountIfPresent. + */ +@property (nonatomic) FBSessionLoginBehavior loginBehavior; + /*! @abstract diff --git a/frameworks/FacebookSDK.framework/Versions/A/Headers/FBRequest.h b/frameworks/FacebookSDK.framework/Versions/A/Headers/FBRequest.h index a6ec08d..187bd7a 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/Headers/FBRequest.h +++ b/frameworks/FacebookSDK.framework/Versions/A/Headers/FBRequest.h @@ -526,6 +526,9 @@ typedef NSUInteger FBRequestState __attribute__((deprecated)); @param graphPath The Graph API endpoint to use for the request, for example "me". @param graphObject An object or open graph action to post. + + @discussion This method is typically used for posting an open graph action. If you are only + posting an open graph object (without an action), consider using `requestForPostOpenGraphObject:` */ + (FBRequest *)requestForPostWithGraphPath:(NSString*)graphPath graphObject:(id)graphObject; diff --git a/frameworks/FacebookSDK.framework/Versions/A/Headers/FBRequestConnection.h b/frameworks/FacebookSDK.framework/Versions/A/Headers/FBRequestConnection.h index a8c2c9a..140267f 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/Headers/FBRequestConnection.h +++ b/frameworks/FacebookSDK.framework/Versions/A/Headers/FBRequestConnection.h @@ -490,7 +490,10 @@ typedef void (^FBRequestHandler)(FBRequestConnection *connection, @param graphObject An object or open graph action to post. @param handler The handler block to call when the request completes with a success, error, or cancel action. - */ + + @discussion This method is typically used for posting an open graph action. If you are only + posting an open graph object (without an action), consider using `startForPostOpenGraphObject:completionHandler:` +*/ + (FBRequestConnection*)startForPostWithGraphPath:(NSString*)graphPath graphObject:(id)graphObject completionHandler:(FBRequestHandler)handler; diff --git a/frameworks/FacebookSDK.framework/Versions/A/Headers/FBSettings.h b/frameworks/FacebookSDK.framework/Versions/A/Headers/FBSettings.h index b38a3aa..a9fc57b 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/Headers/FBSettings.h +++ b/frameworks/FacebookSDK.framework/Versions/A/Headers/FBSettings.h @@ -63,13 +63,25 @@ typedef void (^FBInstallResponseDataHandler)(FBGraphObject *response, NSError *e in release builds. */ typedef enum : NSUInteger { - FBBetaFeaturesNone = 0, + FBBetaFeaturesNone = 0, #if defined(DEBUG) || defined(FB_BUILD_ONLY) - FBBetaFeaturesShareDialog = 1 << 0, - FBBetaFeaturesOpenGraphShareDialog = 1 << 1, + FBBetaFeaturesShareDialog = 1 << 0, + FBBetaFeaturesOpenGraphShareDialog = 1 << 1, #endif } FBBetaFeatures; +/*! + @typedef + @abstract Indicates if this app should be restricted + */ +typedef NS_ENUM(NSUInteger, FBRestrictedTreatment) { + /*! The default treatment indicating the app is not restricted. */ + FBRestrictedTreatmentNO = 0, + + /*! Indicates the app is restricted. */ + FBRestrictedTreatmentYES = 1 +}; + @interface FBSettings : NSObject /*! @@ -296,7 +308,7 @@ typedef enum : NSUInteger { /*! @method - + @abstract Gets whether data such as that generated through FBAppEvents and sent to Facebook should be restricted from being used for other than analytics and conversions. Defaults to NO. This value is stored on the device and persists across app launches. */ @@ -304,10 +316,10 @@ typedef enum : NSUInteger { /*! @method - + @abstract Sets whether data such as that generated through FBAppEvents and sent to Facebook should be restricted from being used for other than analytics and conversions. Defaults to NO. This value is stored on the device and persists across app launches. - + @param limitEventAndDataUsage The desired value. */ + (void)setLimitEventAndDataUsage:(BOOL)limitEventAndDataUsage; diff --git a/frameworks/FacebookSDK.framework/Versions/A/Headers/FacebookSDK.h b/frameworks/FacebookSDK.framework/Versions/A/Headers/FacebookSDK.h index 3fb4b5f..68425e9 100644 --- a/frameworks/FacebookSDK.framework/Versions/A/Headers/FacebookSDK.h +++ b/frameworks/FacebookSDK.framework/Versions/A/Headers/FacebookSDK.h @@ -135,5 +135,5 @@ */ -#define FB_IOS_SDK_VERSION_STRING @"3.9.0" +#define FB_IOS_SDK_VERSION_STRING @"3.11.0" diff --git a/lib-third-party/libturbojpeg-ios/libjpeg-turbo-ios.xcodeproj/project.pbxproj b/lib-third-party/libturbojpeg-ios/libjpeg-turbo-ios.xcodeproj/project.pbxproj index 34949f6..27fcc64 100755 --- a/lib-third-party/libturbojpeg-ios/libjpeg-turbo-ios.xcodeproj/project.pbxproj +++ b/lib-third-party/libturbojpeg-ios/libjpeg-turbo-ios.xcodeproj/project.pbxproj @@ -654,8 +654,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; + ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; @@ -681,8 +680,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; + ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; @@ -700,10 +698,6 @@ 427BF6481645BD8C00BC3809 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - armv7, - armv7s, - ); DSTROOT = /tmp/libjpeg.dst; GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PREFIX_HEADER = ""; @@ -716,10 +710,6 @@ 427BF6491645BD8C00BC3809 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - armv7, - armv7s, - ); DSTROOT = /tmp/libjpeg.dst; GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PREFIX_HEADER = ""; @@ -732,10 +722,6 @@ 427BF68B1645BF1200BC3809 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - armv7, - armv7s, - ); DSTROOT = /tmp/libturbojpeg.dst; HEADER_SEARCH_PATHS = ( "\"$(SRCROOT)/libturbojpeg\"", @@ -750,10 +736,6 @@ 427BF68C1645BF1200BC3809 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - armv7, - armv7s, - ); DSTROOT = /tmp/libturbojpeg.dst; HEADER_SEARCH_PATHS = ( "\"$(SRCROOT)/libturbojpeg\"", @@ -768,13 +750,8 @@ 427BF6BB1645C08600BC3809 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - armv7, - armv7s, - ); DSTROOT = /tmp/simd_arm.dst; GCC_PRECOMPILE_PREFIX_HEADER = NO; - GCC_VERSION = com.apple.compilers.llvmgcc42; GCC_WARN_UNINITIALIZED_AUTOS = NO; HEADER_SEARCH_PATHS = ( "$(SRCROOT)/libturbojpeg", @@ -790,13 +767,8 @@ 427BF6BC1645C08600BC3809 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - armv7, - armv7s, - ); DSTROOT = /tmp/simd_arm.dst; GCC_PRECOMPILE_PREFIX_HEADER = NO; - GCC_VERSION = com.apple.compilers.llvmgcc42; GCC_WARN_UNINITIALIZED_AUTOS = NO; HEADER_SEARCH_PATHS = ( "$(SRCROOT)/libturbojpeg", diff --git a/lib/JFFAsyncOperations/AsyncOperartionsBuilder/JFFAsyncOperationBuilder.m b/lib/JFFAsyncOperations/AsyncOperartionsBuilder/JFFAsyncOperationBuilder.m index f694a9b..1a6fa4c 100755 --- a/lib/JFFAsyncOperations/AsyncOperartionsBuilder/JFFAsyncOperationBuilder.m +++ b/lib/JFFAsyncOperations/AsyncOperartionsBuilder/JFFAsyncOperationBuilder.m @@ -1,80 +1,64 @@ #import "JFFAsyncOperationBuilder.h" #import "JFFAsyncOperationInterface.h" - -@interface JFFComplitionHandlerNotifier : NSObject - -@property (copy) JFFDidFinishAsyncOperationHandler completionHandler; - -- (void)notifyCallbackWithResult:(id)result error:(NSError *)error; - -@end - -@implementation JFFComplitionHandlerNotifier - -- (void)notifyCallbackWithResult:(id)result error:(NSError *)error -{ - if (_completionHandler) { - _completionHandler(result, error); - _completionHandler = nil; - } -} - -@end +#import "JFFAsyncOperationAbstractFinishError.h" //JTODO test JFFAsyncOperation buildAsyncOperationWithAdapterFactoryWithDispatchQueue(JFFAsyncOperationInstanceBuilder objectFactory, dispatch_queue_t callbacksQueue) { objectFactory = [objectFactory copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { __block id asyncObject = objectFactory(); __unsafe_unretained id unretaintedAsyncObject = asyncObject; - doneCallback = [doneCallback copy]; - void (^completionHandler)(id, NSError*) = [^(id result, NSError *error) { + doneCallback = [doneCallback copy]; + stateCallback = [stateCallback copy]; + + __block void (^progressCallbackHolder)(id) = [progressCallback copy]; + + __block JFFDidFinishAsyncOperationCallback finishCallbackHolder = [^(id result, NSError *error) { //use asyncObject in if to own it while waiting result if (!asyncObject) return; - if (doneCallback) { + if (doneCallback) doneCallback(result, error); - } asyncObject = nil; } copy]; - progressCallback = [progressCallback copy]; - __block void (^progressHandler)(id) = [^(id data) { - if (progressCallback) - progressCallback(data); - } copy]; - - completionHandler = [completionHandler copy]; - __block JFFComplitionHandlerNotifier *proxy = [JFFComplitionHandlerNotifier new]; - proxy.completionHandler = completionHandler; + __block BOOL stateCallbackCalled = NO; - __block JFFCancelAsyncOperationHandler cancelCallbackHolder = [cancelCallback copy]; + __block JFFAsyncOperationChangeStateCallback stateCallbackHolder = ^(JFFAsyncOperationState state) { + + stateCallbackCalled = YES; + if (stateCallback) + stateCallback(state); + }; NSThread *currntThread = [NSThread currentThread]; + void (^completionHandler)(id, NSError *) = ^(id result, NSError *error) { + + JFFDidFinishAsyncOperationCallback finishCallbackHolderTmp = finishCallbackHolder; + finishCallbackHolder = nil; + progressCallbackHolder = nil; + stateCallbackHolder = nil; + + if (finishCallbackHolderTmp) + finishCallbackHolderTmp(result, error); + }; + void (^completionHandlerWrapper)(id, NSError *) = [^(id result, NSError *error) { if (!asyncObject) return; - void (^completionHandler)(id, NSError *) = ^(id result, NSError *error) { - JFFComplitionHandlerNotifier *proxyOwner = proxy; - proxy = nil; - progressHandler = nil; - cancelCallbackHolder = nil; - [proxyOwner notifyCallbackWithResult:result error:error]; - }; - if ([asyncObject respondsToSelector:@selector(isForeignThreadResultCallback)] && [asyncObject isForeignThreadResultCallback]) { @@ -84,53 +68,63 @@ __block void (^progressHandler)(id) = [^(id data) { }); } else { - NSCAssert(currntThread == [NSThread currentThread], @"the same thread expected"); + if (dispatch_get_main_queue() == callbacksQueue) { + NSCAssert(currntThread == [NSThread currentThread], @"the same thread expected"); + } completionHandler(result, error); } } copy]; void (^progressHandlerWrapper)(id) = [^(id data) { - if (progressHandler) - progressHandler(data); + if (progressCallbackHolder) + progressCallbackHolder(data); } copy]; - JFFAsyncOperationInterfaceCancelHandler cancelHandlerWrapper = ^(BOOL canceled) { + JFFAsyncOperationChangeStateCallback handlerCallbackWrapper = ^(JFFAsyncOperationState state) { - if (!proxy.completionHandler) { + if (!finishCallbackHolder) return; - } - proxy = nil; - progressHandler = nil; - - if (cancelCallbackHolder) { - JFFCancelAsyncOperationHandler tmpCallback = cancelCallbackHolder; - cancelCallbackHolder = nil; - tmpCallback(canceled); - } + if (stateCallbackHolder) + stateCallbackHolder(state); }; - [asyncObject asyncOperationWithResultHandler:completionHandlerWrapper - cancelHandler:cancelHandlerWrapper - progressHandler:progressHandlerWrapper]; + [asyncObject asyncOperationWithResultCallback:completionHandlerWrapper + handlerCallback:handlerCallbackWrapper + progressCallback:progressHandlerWrapper]; - return ^(BOOL canceled) { + return ^(JFFAsyncOperationHandlerTask task) { - if (!proxy.completionHandler) { + if (!finishCallbackHolder) { return; } - if ([unretaintedAsyncObject respondsToSelector:@selector(cancel:)]) { - [unretaintedAsyncObject cancel:canceled]; + if ([unretaintedAsyncObject respondsToSelector:@selector(doTask:)]) { + + stateCallbackCalled = NO; + [unretaintedAsyncObject doTask:task]; + } else { + + NSCParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); } - proxy = nil; - progressHandler = nil; + NSError *error = [JFFAsyncOperationAbstractFinishError newAsyncOperationAbstractFinishErrorWithHandlerTask:task]; - if (cancelCallbackHolder) { - JFFCancelAsyncOperationHandler tmpCallback = cancelCallbackHolder; - cancelCallbackHolder = nil; - tmpCallback(canceled); + if (error) { + completionHandler(nil, error); + return; + } else { + + if (!stateCallbackCalled) { + + if (stateCallbackHolder) { + + JFFAsyncOperationState state = (task == JFFAsyncOperationHandlerTaskResume) + ?JFFAsyncOperationStateResumed + :JFFAsyncOperationStateSuspended; + stateCallbackHolder(state); + } + } } }; }; diff --git a/lib/JFFAsyncOperations/AsyncOperartionsBuilder/JFFAsyncOperationInterface.h b/lib/JFFAsyncOperations/AsyncOperartionsBuilder/JFFAsyncOperationInterface.h index 653828a..07cc1d0 100644 --- a/lib/JFFAsyncOperations/AsyncOperartionsBuilder/JFFAsyncOperationInterface.h +++ b/lib/JFFAsyncOperations/AsyncOperartionsBuilder/JFFAsyncOperationInterface.h @@ -2,19 +2,15 @@ #import -typedef void (^JFFAsyncOperationInterfaceResultHandler)(id, NSError *); -typedef void (^JFFAsyncOperationInterfaceCancelHandler)(BOOL canceled); -typedef void (^JFFAsyncOperationInterfaceProgressHandler)(id); - @protocol JFFAsyncOperationInterface @required -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress; +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finnishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback; @optional -- (void)cancel:(BOOL)canceled; +- (void)doTask:(JFFAsyncOperationHandlerTask)task; - (BOOL)isForeignThreadResultCallback; diff --git a/lib/JFFAsyncOperations/CachedAsyncOperations/Detail/JFFObjectRelatedPropertyData.h b/lib/JFFAsyncOperations/CachedAsyncOperations/Detail/JFFObjectRelatedPropertyData.h index 2c8611d..429ecf5 100644 --- a/lib/JFFAsyncOperations/CachedAsyncOperations/Detail/JFFObjectRelatedPropertyData.h +++ b/lib/JFFAsyncOperations/CachedAsyncOperations/Detail/JFFObjectRelatedPropertyData.h @@ -6,7 +6,7 @@ @property (nonatomic) NSMutableArray *delegates; @property (nonatomic, copy) JFFAsyncOperation asyncLoader; -@property (nonatomic, copy) JFFDidFinishAsyncOperationHandler didFinishBlock; -@property (nonatomic, copy) JFFCancelAsyncOperation cancelBlock; +@property (nonatomic, copy) JFFDidFinishAsyncOperationCallback didFinishBlock; +@property (nonatomic, copy) JFFAsyncOperationHandler loaderHandler; @end diff --git a/lib/JFFAsyncOperations/CachedAsyncOperations/JFFPropertyExtractor.h b/lib/JFFAsyncOperations/CachedAsyncOperations/JFFPropertyExtractor.h index 79ed45f..ead50e0 100644 --- a/lib/JFFAsyncOperations/CachedAsyncOperations/JFFPropertyExtractor.h +++ b/lib/JFFAsyncOperations/CachedAsyncOperations/JFFPropertyExtractor.h @@ -11,9 +11,9 @@ //object related data @property (nonatomic) NSMutableArray *delegates; -@property (nonatomic, copy) JFFCancelAsyncOperation cancelBlock; @property (nonatomic, copy) JFFAsyncOperation asyncLoader; -@property (nonatomic, copy) JFFDidFinishAsyncOperationHandler didFinishBlock; +@property (nonatomic, copy) JFFAsyncOperationHandler loaderHandler; +@property (nonatomic, copy) JFFDidFinishAsyncOperationCallback didFinishBlock; @property (nonatomic) id property; diff --git a/lib/JFFAsyncOperations/CachedAsyncOperations/JFFPropertyExtractor.m b/lib/JFFAsyncOperations/CachedAsyncOperations/JFFPropertyExtractor.m index 3b09d1b..b9ac07b 100644 --- a/lib/JFFAsyncOperations/CachedAsyncOperations/JFFPropertyExtractor.m +++ b/lib/JFFAsyncOperations/CachedAsyncOperations/JFFPropertyExtractor.m @@ -25,7 +25,7 @@ @implementation JFFPropertyExtractor delegates, asyncLoader, didFinishBlock, -cancelBlock; +loaderHandler; - (void)clearData { @@ -55,22 +55,31 @@ - (SEL)propertySetSelector - (id)property { - id result = objc_msgSend(self.object, self.propertyGetSelector); + typedef id (*AlignMsgSendFunction)(id, SEL); + AlignMsgSendFunction alignFunction = (AlignMsgSendFunction)objc_msgSend; + id result = alignFunction(self.object, self.propertyGetSelector); return self.propertyPath.key?[result objectForKey:self.propertyPath.key]:result; } - (void)setProperty:(id)property { if (!self.propertyPath.key) { - objc_msgSend(self.object, self.propertySetSelector, property); + + typedef void (*AlignMsgSendFunction)(id, SEL, id); + AlignMsgSendFunction alignFunction = (AlignMsgSendFunction)objc_msgSend; + alignFunction(self.object, self.propertySetSelector, property); return; } - NSMutableDictionary* dict = objc_msgSend(self.object, self.propertyGetSelector); + typedef NSMutableDictionary *(*AlignMsgSendFunction)(id, SEL); + AlignMsgSendFunction alignFunction = (AlignMsgSendFunction)objc_msgSend; + NSMutableDictionary *dict = alignFunction(self.object, self.propertyGetSelector); if (!dict) { dict = [NSMutableDictionary new]; - objc_msgSend(self.object, self.propertySetSelector, dict); + typedef void (*AlignMsgSendFunction)(id, SEL, NSMutableDictionary *); + AlignMsgSendFunction alignFunction = (AlignMsgSendFunction)objc_msgSend; + alignFunction(self.object, self.propertySetSelector, dict); } if (property) { diff --git a/lib/JFFAsyncOperations/CachedAsyncOperations/NSObject+AsyncPropertyReader.h b/lib/JFFAsyncOperations/CachedAsyncOperations/NSObject+AsyncPropertyReader.h index c6aba6c..83511d0 100755 --- a/lib/JFFAsyncOperations/CachedAsyncOperations/NSObject+AsyncPropertyReader.h +++ b/lib/JFFAsyncOperations/CachedAsyncOperations/NSObject+AsyncPropertyReader.h @@ -17,14 +17,14 @@ typedef JFFPropertyExtractor *(^JFFPropertyExtractorFactoryBlock)(void); - (JFFAsyncOperation)asyncOperationForPropertyWithName:(NSString *)propertyName asyncOperation:(JFFAsyncOperation)asyncOperation - didFinishLoadDataBlock:(JFFDidFinishAsyncOperationHandler)didFinishOperation; + didFinishLoadDataBlock:(JFFDidFinishAsyncOperationCallback)didFinishOperation; - (JFFAsyncOperation)asyncOperationForPropertyWithPath:(JFFPropertyPath *)propertyPath asyncOperation:(JFFAsyncOperation)asyncOperation; - (JFFAsyncOperation)asyncOperationForPropertyWithPath:(JFFPropertyPath *)propertyPath asyncOperation:(JFFAsyncOperation)asyncOperation - didFinishLoadDataBlock:(JFFDidFinishAsyncOperationHandler)didFinishOperation; + didFinishLoadDataBlock:(JFFDidFinishAsyncOperationCallback)didFinishOperation; - (JFFAsyncOperation)asyncOperationForPropertyWithPath:(JFFPropertyPath *)propertyPath propertyExtractorFactoryBlock:(JFFPropertyExtractorFactoryBlock)factory @@ -33,7 +33,7 @@ typedef JFFPropertyExtractor *(^JFFPropertyExtractorFactoryBlock)(void); - (JFFAsyncOperation)asyncOperationForPropertyWithPath:(JFFPropertyPath *)propertyPath propertyExtractorFactoryBlock:(JFFPropertyExtractorFactoryBlock)factory asyncOperation:(JFFAsyncOperation)asyncOperation - didFinishLoadDataBlock:(JFFDidFinishAsyncOperationHandler)didFinishOperation; + didFinishLoadDataBlock:(JFFDidFinishAsyncOperationCallback)didFinishOperation; - (JFFAsyncOperation)asyncOperationMergeLoaders:(JFFAsyncOperation)asyncOperation withArgument:(id< NSCopying, NSObject >)argument; diff --git a/lib/JFFAsyncOperations/CachedAsyncOperations/NSObject+AsyncPropertyReader.m b/lib/JFFAsyncOperations/CachedAsyncOperations/NSObject+AsyncPropertyReader.m index c22c220..d2165dc 100644 --- a/lib/JFFAsyncOperations/CachedAsyncOperations/NSObject+AsyncPropertyReader.m +++ b/lib/JFFAsyncOperations/CachedAsyncOperations/NSObject+AsyncPropertyReader.m @@ -3,11 +3,53 @@ #import "JFFPropertyPath.h" #import "JFFPropertyExtractor.h" #import "JFFObjectRelatedPropertyData.h" -#import "JFFCallbacksBlocksHolder.h" #import "JFFAsyncOperationsPredefinedBlocks.h" +#import "JFFAsyncOpFinishedByUnsubscriptionError.h" + #import "NSObject+PropertyExtractor.h" +@interface JFFCallbacksBlocksHolder : NSObject + +@property (nonatomic, copy) JFFAsyncOperationProgressCallback onProgressBlock; +@property (nonatomic, copy) JFFAsyncOperationChangeStateCallback onChangeStateBlock; +@property (nonatomic, copy) JFFDidFinishAsyncOperationCallback didLoadDataBlock; + +- (instancetype)initWithOnProgressBlock:(JFFAsyncOperationProgressCallback)onProgressBlock + onCancelBlock:(JFFAsyncOperationChangeStateCallback)onCancelBlock + didLoadDataBlock:(JFFDidFinishAsyncOperationCallback)didLoadDataBlock; + +- (void)clearCallbacks; + +@end + +@implementation JFFCallbacksBlocksHolder + +- (instancetype)initWithOnProgressBlock:(JFFAsyncOperationProgressCallback)onProgressBlock + onCancelBlock:(JFFAsyncOperationChangeStateCallback)onCancelBlock + didLoadDataBlock:(JFFDidFinishAsyncOperationCallback)didLoadDataBlock +{ + self = [super init]; + + if (self) { + + _onProgressBlock = [onProgressBlock copy]; + _onChangeStateBlock = [onCancelBlock copy]; + _didLoadDataBlock = [didLoadDataBlock copy]; + } + + return self; +} + +- (void)clearCallbacks +{ + _onProgressBlock = nil; + _onChangeStateBlock = nil; + _didLoadDataBlock = nil; +} + +@end + @interface JFFCachePropertyExtractor : JFFPropertyExtractor @end @@ -65,11 +107,8 @@ - (BOOL)hasAsyncPropertyDelegates static void clearDelegates(NSArray *delegates) { - [delegates each:^void(id obj) { - JFFCallbacksBlocksHolder *callback = obj; - callback.didLoadDataBlock = nil; - callback.onCancelBlock = nil; - callback.onProgressBlock = nil; + [delegates each:^void(JFFCallbacksBlocksHolder *callback) { + [callback clearCallbacks]; }]; } @@ -77,40 +116,66 @@ static void clearDataForPropertyExtractor(JFFPropertyExtractor *propertyExtracto { clearDelegates(propertyExtractor.delegates); propertyExtractor.delegates = nil; - propertyExtractor.cancelBlock = nil; + propertyExtractor.loaderHandler = nil; propertyExtractor.didFinishBlock = nil; propertyExtractor.asyncLoader = nil; [propertyExtractor clearData]; } -static JFFCancelAsyncOperation cancelBlock(JFFPropertyExtractor *propertyExtractor, +static JFFAsyncOperationHandler cancelBlock(JFFPropertyExtractor *propertyExtractor, JFFCallbacksBlocksHolder *callbacks) { - return ^void(BOOL cancelOperation) { - JFFCancelAsyncOperation cancel = propertyExtractor.cancelBlock; - if (!cancel) + return ^void(JFFAsyncOperationHandlerTask task) { + + JFFAsyncOperationHandler handler = propertyExtractor.loaderHandler; + if (!handler) return; - cancel = [cancel copy]; + handler = [handler copy]; - if (cancelOperation) { - cancel(YES); - clearDataForPropertyExtractor(propertyExtractor); - } else { - [propertyExtractor.delegates removeObject:callbacks]; - callbacks.didLoadDataBlock = nil; - callbacks.onProgressBlock = nil; - - if (callbacks.onCancelBlock) - callbacks.onCancelBlock(NO); - - callbacks.onCancelBlock = nil; + switch (task) { + case JFFAsyncOperationHandlerTaskUnSubscribe: + { + JFFDidFinishAsyncOperationCallback didLoadDataBlock = callbacks.didLoadDataBlock; + + [propertyExtractor.delegates removeObject:callbacks]; + [callbacks clearCallbacks]; + + if (didLoadDataBlock) + didLoadDataBlock(nil, [JFFAsyncOpFinishedByUnsubscriptionError new]); + break; + } + case JFFAsyncOperationHandlerTaskCancel: + { + handler(JFFAsyncOperationHandlerTaskCancel); + clearDataForPropertyExtractor(propertyExtractor); + break; + } + case JFFAsyncOperationHandlerTaskResume: + case JFFAsyncOperationHandlerTaskSuspend: + { + [propertyExtractor.delegates each:^void(id obj) { + JFFCallbacksBlocksHolder *objCallback = obj; + if (objCallback.onChangeStateBlock) { + JFFAsyncOperationState state = (task == JFFAsyncOperationHandlerTaskResume) + ?JFFAsyncOperationStateResumed + :JFFAsyncOperationStateSuspended; + objCallback.onChangeStateBlock(state); + } + }]; + break; + } + default: + { + NSCAssert1(NO, @"unsupported type of task: %lu", (unsigned long)task); + break; + } } }; } -static JFFDidFinishAsyncOperationHandler doneCallbackBlock(JFFPropertyExtractor *propertyExtractor) +static JFFDidFinishAsyncOperationCallback doneCallbackBlock(JFFPropertyExtractor *propertyExtractor) { return ^void(id result, NSError *error) { if (!((result != nil) ^ (error != nil))) { @@ -127,11 +192,11 @@ static JFFDidFinishAsyncOperationHandler doneCallbackBlock(JFFPropertyExtractor NSArray *copyDelegates = [propertyExtractor.delegates map:^id(id obj) { JFFCallbacksBlocksHolder *callback = obj; return [[JFFCallbacksBlocksHolder alloc] initWithOnProgressBlock:callback.onProgressBlock - onCancelBlock:callback.onCancelBlock + onCancelBlock:callback.onChangeStateBlock didLoadDataBlock:callback.didLoadDataBlock]; }]; - JFFDidFinishAsyncOperationHandler finishBlock = [propertyExtractor.didFinishBlock copy]; + JFFDidFinishAsyncOperationCallback finishBlock = [propertyExtractor.didFinishBlock copy]; propertyExtractor.property = result; @@ -152,10 +217,10 @@ static JFFDidFinishAsyncOperationHandler doneCallbackBlock(JFFPropertyExtractor }; } -static JFFCancelAsyncOperation performNativeLoader(JFFPropertyExtractor *propertyExtractor, +static JFFAsyncOperationHandler performNativeLoader(JFFPropertyExtractor *propertyExtractor, JFFCallbacksBlocksHolder *callbacks) { - JFFAsyncOperationProgressHandler progressCallback = ^void(id progressInfo) { + JFFAsyncOperationProgressCallback progressCallback = ^void(id progressInfo) { [propertyExtractor.delegates each:^void(id obj) { JFFCallbacksBlocksHolder *objCallback = obj; if (objCallback.onProgressBlock) @@ -163,25 +228,23 @@ static JFFCancelAsyncOperation performNativeLoader(JFFPropertyExtractor *propert }]; }; - JFFDidFinishAsyncOperationHandler doneCallback = doneCallbackBlock(propertyExtractor); + JFFDidFinishAsyncOperationCallback doneCallback = doneCallbackBlock(propertyExtractor); - JFFCancelAsyncOperationHandler cancelCallback = ^void(BOOL canceled) { + JFFAsyncOperationChangeStateCallback stateCallback = ^void(JFFAsyncOperationState state) { [propertyExtractor.delegates each:^void(id obj) { JFFCallbacksBlocksHolder *objCallback = obj; - if (objCallback.onCancelBlock) - objCallback.onCancelBlock(canceled); + if (objCallback.onChangeStateBlock) + objCallback.onChangeStateBlock(state); }]; - - clearDataForPropertyExtractor(propertyExtractor); }; - propertyExtractor.cancelBlock = propertyExtractor.asyncLoader(progressCallback, - cancelCallback, - doneCallback); - - if (nil == propertyExtractor.cancelBlock) - return JFFStubCancelAsyncOperationBlock; + propertyExtractor.loaderHandler = propertyExtractor.asyncLoader(progressCallback, + stateCallback, + doneCallback); + + if (nil == propertyExtractor.loaderHandler) + return JFFStubHandlerAsyncOperationBlock; return cancelBlock(propertyExtractor, callbacks); } @@ -196,7 +259,7 @@ -(BOOL)isLoadingPropertyForPropertyName:(NSString *)name - (JFFAsyncOperation)privateAsyncOperationForPropertyWithPath:(JFFPropertyPath *)propertyPath propertyExtractorFactoryBlock:(JFFPropertyExtractorFactoryBlock)factory asyncOperation:(JFFAsyncOperation)asyncOperation - didFinishLoadDataBlock:(JFFDidFinishAsyncOperationHandler)didFinishOperation + didFinishLoadDataBlock:(JFFDidFinishAsyncOperationCallback)didFinishOperation { NSParameterAssert(asyncOperation); @@ -204,9 +267,10 @@ - (JFFAsyncOperation)privateAsyncOperationForPropertyWithPath:(JFFPropertyPath * didFinishOperation = [didFinishOperation copy]; factory = [factory copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { + JFFPropertyExtractor *propertyExtractor = factory(); propertyExtractor.object = self; propertyExtractor.propertyPath = propertyPath; @@ -216,7 +280,7 @@ - (JFFAsyncOperation)privateAsyncOperationForPropertyWithPath:(JFFPropertyPath * if (result) { if (doneCallback) doneCallback(result, nil); - return JFFStubCancelAsyncOperationBlock; + return JFFStubHandlerAsyncOperationBlock; } propertyExtractor.asyncLoader = asyncOperation; @@ -224,26 +288,23 @@ - (JFFAsyncOperation)privateAsyncOperationForPropertyWithPath:(JFFPropertyPath * JFFCallbacksBlocksHolder *callbacks = [[JFFCallbacksBlocksHolder alloc] initWithOnProgressBlock:progressCallback - onCancelBlock:cancelCallback + onCancelBlock:stateCallback didLoadDataBlock:doneCallback]; if (nil == propertyExtractor.delegates) { propertyExtractor.delegates = [@[callbacks] mutableCopy]; + return performNativeLoader(propertyExtractor, callbacks); } - if (propertyExtractor.cancelBlock != nil) { - [propertyExtractor.delegates addObject:callbacks]; - return cancelBlock(propertyExtractor, callbacks); - } - - return performNativeLoader(propertyExtractor, callbacks); + [propertyExtractor.delegates addObject:callbacks]; + return cancelBlock(propertyExtractor, callbacks); }; } - (JFFAsyncOperation)asyncOperationForPropertyWithPath:(JFFPropertyPath *)propertyPath propertyExtractorFactoryBlock:(JFFPropertyExtractorFactoryBlock)factory asyncOperation:(JFFAsyncOperation)asyncOperation - didFinishLoadDataBlock:(JFFDidFinishAsyncOperationHandler)didFinishOperation + didFinishLoadDataBlock:(JFFDidFinishAsyncOperationCallback)didFinishOperation { NSAssert(propertyPath.name && propertyPath.key, @"propertyName argument should not be nil"); return [self privateAsyncOperationForPropertyWithPath:propertyPath @@ -264,7 +325,7 @@ - (JFFAsyncOperation)asyncOperationForPropertyWithPath:(JFFPropertyPath *)proper - (JFFAsyncOperation)privateAsyncOperationForPropertyWithPath:(JFFPropertyPath *)propertyPath asyncOperation:(JFFAsyncOperation)asyncOperation - didFinishLoadDataBlock:(JFFDidFinishAsyncOperationHandler)didFinishOperation + didFinishLoadDataBlock:(JFFDidFinishAsyncOperationCallback)didFinishOperation { JFFPropertyExtractorFactoryBlock factory = ^JFFPropertyExtractor*(void) { return [JFFPropertyExtractor new]; @@ -286,7 +347,7 @@ - (JFFAsyncOperation)asyncOperationForPropertyWithName:(NSString *)propertyName - (JFFAsyncOperation)asyncOperationForPropertyWithName:(NSString *)propertyName asyncOperation:(JFFAsyncOperation)asyncOperation - didFinishLoadDataBlock:(JFFDidFinishAsyncOperationHandler)didFinishOperation + didFinishLoadDataBlock:(JFFDidFinishAsyncOperationCallback)didFinishOperation { NSParameterAssert(propertyName); JFFPropertyPath *propertyPath = [[JFFPropertyPath alloc] initWithName:propertyName key:nil]; @@ -306,7 +367,7 @@ - (JFFAsyncOperation)asyncOperationForPropertyWithPath:(JFFPropertyPath *)proper - (JFFAsyncOperation)asyncOperationForPropertyWithPath:(JFFPropertyPath *)propertyPath asyncOperation:(JFFAsyncOperation)asyncOperation - didFinishLoadDataBlock:(JFFDidFinishAsyncOperationHandler)didFinishOperation + didFinishLoadDataBlock:(JFFDidFinishAsyncOperationCallback)didFinishOperation { NSAssert(propertyPath.name && propertyPath.key, @"propertyName argument should not be nil"); return [self privateAsyncOperationForPropertyWithPath:propertyPath @@ -320,7 +381,7 @@ - (JFFAsyncOperation)privateAsyncOperationMergeLoaders:(JFFAsyncOperation)asyncO static NSString *const name = @".__JFF_MERGE_LOADERS_BY_ARGUMENTS__."; JFFPropertyPath *propertyPath = [[JFFPropertyPath alloc] initWithName:name key:argument]; - JFFPropertyExtractorFactoryBlock factory = ^JFFPropertyExtractor*{ + JFFPropertyExtractorFactoryBlock factory = ^JFFPropertyExtractor * (void){ return [JFFCachePropertyExtractor new]; }; diff --git a/lib/JFFAsyncOperations/Categories/NSArray+AsyncMap.m b/lib/JFFAsyncOperations/Categories/NSArray+AsyncMap.m index a1c158a..c09fdaa 100644 --- a/lib/JFFAsyncOperations/Categories/NSArray+AsyncMap.m +++ b/lib/JFFAsyncOperations/Categories/NSArray+AsyncMap.m @@ -28,7 +28,7 @@ - (JFFAsyncOperation)tolerantFaultAsyncMap:(JFFAsyncOperationBinder)block NSArray *asyncOperations = [self map:^id(id object) { JFFAsyncOperation loader = block(object); - JFFDidFinishAsyncOperationHandler finishCallbackBlock = ^void(id localResult, NSError *error) { + JFFDidFinishAsyncOperationCallback finishCallbackBlock = ^void(id localResult, NSError *error) { if (localResult) [result addObject:localResult]; diff --git a/lib/JFFAsyncOperations/Categories/NSDictionary+AsyncMap.m b/lib/JFFAsyncOperations/Categories/NSDictionary+AsyncMap.m index a400ff7..cf7162e 100644 --- a/lib/JFFAsyncOperations/Categories/NSDictionary+AsyncMap.m +++ b/lib/JFFAsyncOperations/Categories/NSDictionary+AsyncMap.m @@ -17,13 +17,12 @@ - (JFFAsyncOperation)asyncMap:(JFFAsyncDictMappingBlock)block JFFDidFinishAsyncOperationHook finishCallbackHook = ^(id result, NSError *error, - JFFDidFinishAsyncOperationHandler doneCallback) { + JFFDidFinishAsyncOperationCallback doneCallback) { if (result) finalResult[key] = result; - if (doneCallback) - doneCallback(result, error); + doneCallback(result, error); }; loader = asyncOperationWithFinishHookBlock(loader, finishCallbackHook); diff --git a/lib/JFFAsyncOperations/Categories/NSObject+AutoCancelAsyncOperation.h b/lib/JFFAsyncOperations/Categories/NSObject+AutoCancelAsyncOperation.h new file mode 100644 index 0000000..6662a15 --- /dev/null +++ b/lib/JFFAsyncOperations/Categories/NSObject+AutoCancelAsyncOperation.h @@ -0,0 +1,12 @@ +#import + +#import + +@interface NSObject (WeakAsyncOperation) + +//TODO20 immediately cancel callback +- (JFFAsyncOperation)autoUnsubsribeOnDeallocAsyncOperation:(JFFAsyncOperation)asyncOp; + +- (JFFAsyncOperation)autoCancelOnDeallocAsyncOperation:(JFFAsyncOperation)asyncOp; + +@end diff --git a/lib/JFFAsyncOperations/Categories/NSObject+AutoCancelAsyncOperation.m b/lib/JFFAsyncOperations/Categories/NSObject+AutoCancelAsyncOperation.m new file mode 100644 index 0000000..cb0b2c3 --- /dev/null +++ b/lib/JFFAsyncOperations/Categories/NSObject+AutoCancelAsyncOperation.m @@ -0,0 +1,99 @@ +#import "NSObject+AutoCancelAsyncOperation.h" + +#import "JFFAsyncOperationsPredefinedBlocks.h" +#import "JFFDidFinishAsyncOperationBlockHolder.h" +#import "JFFAsyncOperationAbstractFinishError.h" + +@implementation NSObject (WeakAsyncOperation) + +- (JFFAsyncOperation)autoUnsibscribeOrCancelAsyncOperation:(JFFAsyncOperation)nativeAsyncOp + task:(JFFAsyncOperationHandlerTask)task +{ + NSParameterAssert(nativeAsyncOp); + + __weak id weakSelf = self; + + nativeAsyncOp = [nativeAsyncOp copy]; + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) + { + id self_ = weakSelf; + + if (self_ == nil) { + + NSError *error = [JFFAsyncOperationAbstractFinishError newAsyncOperationAbstractFinishErrorWithHandlerTask:task]; + if (doneCallback) + doneCallback(nil, error); + return JFFStubHandlerAsyncOperationBlock; + } + + __block BOOL finished = NO; + + JFFSimpleBlockHolder *ondeallocBlockHolder = [JFFSimpleBlockHolder new]; + + JFFSimpleBlockHolder *removeOndeallocBlockHolder = [JFFSimpleBlockHolder new]; + removeOndeallocBlockHolder.simpleBlock = ^void(void) { + finished = YES; + + if (ondeallocBlockHolder.simpleBlock) { + [weakSelf removeOnDeallocBlock:ondeallocBlockHolder.simpleBlock]; + ondeallocBlockHolder.simpleBlock = nil; + } + }; + + JFFDidFinishAsyncOperationBlockHolder *doneCallbackHolder = [JFFDidFinishAsyncOperationBlockHolder new]; + doneCallbackHolder.didFinishBlock = doneCallback; + JFFDidFinishAsyncOperationCallback doneCallbackWrapper = ^void(id result, NSError *error) { + removeOndeallocBlockHolder.onceSimpleBlock(); + doneCallbackHolder.onceDidFinishBlock(result, error); + }; + + JFFAsyncOperationHandler loadersHandler = nativeAsyncOp(progressCallback, + stateCallback, + doneCallbackWrapper); + + if (finished) { + return JFFStubHandlerAsyncOperationBlock; + } + + //TODO remove using of ondealloc block holder class + ondeallocBlockHolder.simpleBlock = ^void(void) { + + loadersHandler(task); + }; + + //try assert retain count + [self_ addOnDeallocBlock:ondeallocBlockHolder.onceSimpleBlock]; + + __block JFFAsyncOperationHandler handlerBlockHolder = [^void(JFFAsyncOperationHandlerTask task) { + loadersHandler(task); + } copy]; + + return ^(JFFAsyncOperationHandlerTask task) { + + JFFAsyncOperationHandler hadler = handlerBlockHolder; + if (!hadler) + return; + + if (task <= JFFAsyncOperationHandlerTaskCancel) { + handlerBlockHolder = nil; + } + hadler(task); + }; + }; +} + +- (JFFAsyncOperation)autoUnsubsribeOnDeallocAsyncOperation:(JFFAsyncOperation)nativeLoader +{ + return [self autoUnsibscribeOrCancelAsyncOperation:nativeLoader + task:JFFAsyncOperationHandlerTaskUnSubscribe]; +} + +- (JFFAsyncOperation)autoCancelOnDeallocAsyncOperation:(JFFAsyncOperation)nativeLoader +{ + return [self autoUnsibscribeOrCancelAsyncOperation:nativeLoader + task:JFFAsyncOperationHandlerTaskCancel]; +} + +@end diff --git a/lib/JFFAsyncOperations/Detail/JFFAsyncOperationAdapter.mm b/lib/JFFAsyncOperations/Detail/JFFAsyncOperationAdapter.mm index e52b8fc..616e773 100644 --- a/lib/JFFAsyncOperations/Detail/JFFAsyncOperationAdapter.mm +++ b/lib/JFFAsyncOperations/Detail/JFFAsyncOperationAdapter.mm @@ -16,22 +16,23 @@ - (instancetype)init return self; } -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { self.operation = [JFFBlockOperation performOperationWithQueueName:_queueName.c_str() loadDataBlock:_loadDataBlock - didLoadDataBlock:handler - progressBlock:progress + didLoadDataBlock:finishCallback + progressBlock:progressCallback barrier:_barrier currentQueue:_currentQueue serialOrConcurrent:_queueAttributes]; } -- (void)cancel:(BOOL)canceled +- (void)doTask:(JFFAsyncOperationHandlerTask)task { - if (canceled) { + NSParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); + if (task == JFFAsyncOperationHandlerTaskCancel) { [_operation cancel]; _operation = nil; } diff --git a/lib/JFFAsyncOperations/Detail/JFFCallbacksBlocksHolder.h b/lib/JFFAsyncOperations/Detail/JFFCallbacksBlocksHolder.h deleted file mode 100755 index 8a76bb5..0000000 --- a/lib/JFFAsyncOperations/Detail/JFFCallbacksBlocksHolder.h +++ /dev/null @@ -1,15 +0,0 @@ -#import - -#import - -@interface JFFCallbacksBlocksHolder : NSObject - -@property (nonatomic, copy) JFFAsyncOperationProgressHandler onProgressBlock; -@property (nonatomic, copy) JFFCancelAsyncOperationHandler onCancelBlock; -@property (nonatomic, copy) JFFDidFinishAsyncOperationHandler didLoadDataBlock; - -- (instancetype)initWithOnProgressBlock:(JFFAsyncOperationProgressHandler)onProgressBlock - onCancelBlock:(JFFCancelAsyncOperationHandler)onCancelBlock - didLoadDataBlock:(JFFDidFinishAsyncOperationHandler)didLoadDataBlock; - -@end diff --git a/lib/JFFAsyncOperations/Detail/JFFCallbacksBlocksHolder.m b/lib/JFFAsyncOperations/Detail/JFFCallbacksBlocksHolder.m deleted file mode 100755 index 51ff5a0..0000000 --- a/lib/JFFAsyncOperations/Detail/JFFCallbacksBlocksHolder.m +++ /dev/null @@ -1,21 +0,0 @@ -#import "JFFCallbacksBlocksHolder.h" - -@implementation JFFCallbacksBlocksHolder - -- (instancetype)initWithOnProgressBlock:(JFFAsyncOperationProgressHandler)onProgressBlock - onCancelBlock:(JFFCancelAsyncOperationHandler)onCancelBlock - didLoadDataBlock:(JFFDidFinishAsyncOperationHandler)didLoadDataBlock -{ - self = [super init]; - - if (self) { - - _onProgressBlock = [onProgressBlock copy]; - _onCancelBlock = [onCancelBlock copy]; - _didLoadDataBlock = [didLoadDataBlock copy]; - } - - return self; -} - -@end diff --git a/lib/JFFAsyncOperations/Errors/JFFAsyncOpFinishedByCancellationError.h b/lib/JFFAsyncOperations/Errors/JFFAsyncOpFinishedByCancellationError.h new file mode 100644 index 0000000..073ef4c --- /dev/null +++ b/lib/JFFAsyncOperations/Errors/JFFAsyncOpFinishedByCancellationError.h @@ -0,0 +1,4 @@ +#import + +@interface JFFAsyncOpFinishedByCancellationError : JFFAsyncOperationAbstractFinishError +@end diff --git a/lib/JFFAsyncOperations/Errors/JFFAsyncOpFinishedByCancellationError.m b/lib/JFFAsyncOperations/Errors/JFFAsyncOpFinishedByCancellationError.m new file mode 100644 index 0000000..164fc37 --- /dev/null +++ b/lib/JFFAsyncOperations/Errors/JFFAsyncOpFinishedByCancellationError.m @@ -0,0 +1,31 @@ +#import "JFFAsyncOpFinishedByCancellationError.h" + +@implementation JFFAsyncOpFinishedByCancellationError + ++ (instancetype)alloc +{ + static JFFAsyncOpFinishedByCancellationError *instance = nil; + + if (!instance) { + + instance = [super alloc]; + } + + return instance; +} + +- (instancetype)init +{ + return [self initWithDescription:NSLocalizedString(@"JFF_ASYNC_OPERATION_FINISHED_BY_CANCELLATION_ERROR", nil)]; +} + ++ (NSString *)jffErrorsDomain +{ + return @"com.just_for_fun.async_unsubscribed.jff_async_operations.library"; +} + +- (void)writeErrorWithJFFLogger +{ +} + +@end diff --git a/lib/JFFAsyncOperations/Errors/JFFAsyncOpFinishedByUnsubscriptionError.h b/lib/JFFAsyncOperations/Errors/JFFAsyncOpFinishedByUnsubscriptionError.h new file mode 100644 index 0000000..f157f9b --- /dev/null +++ b/lib/JFFAsyncOperations/Errors/JFFAsyncOpFinishedByUnsubscriptionError.h @@ -0,0 +1,4 @@ +#import + +@interface JFFAsyncOpFinishedByUnsubscriptionError : JFFAsyncOperationAbstractFinishError +@end diff --git a/lib/JFFAsyncOperations/Errors/JFFAsyncOpFinishedByUnsubscriptionError.m b/lib/JFFAsyncOperations/Errors/JFFAsyncOpFinishedByUnsubscriptionError.m new file mode 100644 index 0000000..48fd54f --- /dev/null +++ b/lib/JFFAsyncOperations/Errors/JFFAsyncOpFinishedByUnsubscriptionError.m @@ -0,0 +1,31 @@ +#import "JFFAsyncOpFinishedByUnsubscriptionError.h" + +@implementation JFFAsyncOpFinishedByUnsubscriptionError + ++ (instancetype)alloc +{ + static JFFAsyncOpFinishedByUnsubscriptionError *instance = nil; + + if (!instance) { + + instance = [super alloc]; + } + + return instance; +} + +- (instancetype)init +{ + return [self initWithDescription:NSLocalizedString(@"JFF_ASYNC_OPERATION_FINISHED_BY_UNSUBSCRIPTION_ERROR", nil)]; +} + ++ (NSString *)jffErrorsDomain +{ + return @"com.just_for_fun.async_unsubscribed.jff_async_operations.library"; +} + +- (void)writeErrorWithJFFLogger +{ +} + +@end diff --git a/lib/JFFAsyncOperations/Errors/JFFAsyncOperationAbstractFinishError.h b/lib/JFFAsyncOperations/Errors/JFFAsyncOperationAbstractFinishError.h new file mode 100644 index 0000000..fad5459 --- /dev/null +++ b/lib/JFFAsyncOperations/Errors/JFFAsyncOperationAbstractFinishError.h @@ -0,0 +1,8 @@ +#import +#include + +@interface JFFAsyncOperationAbstractFinishError : JFFAsyncOperationError + ++ (instancetype)newAsyncOperationAbstractFinishErrorWithHandlerTask:(JFFAsyncOperationHandlerTask)task; + +@end diff --git a/lib/JFFAsyncOperations/Errors/JFFAsyncOperationAbstractFinishError.m b/lib/JFFAsyncOperations/Errors/JFFAsyncOperationAbstractFinishError.m new file mode 100644 index 0000000..626ce36 --- /dev/null +++ b/lib/JFFAsyncOperations/Errors/JFFAsyncOperationAbstractFinishError.m @@ -0,0 +1,18 @@ +#import "JFFAsyncOperationAbstractFinishError.h" + +#import "JFFAsyncOpFinishedByCancellationError.h" +#import "JFFAsyncOpFinishedByUnsubscriptionError.h" + +@implementation JFFAsyncOperationAbstractFinishError + ++ (instancetype)newAsyncOperationAbstractFinishErrorWithHandlerTask:(JFFAsyncOperationHandlerTask)task +{ + if (task > JFFAsyncOperationHandlerTaskCancel) + return nil; + + return (task == JFFAsyncOperationHandlerTaskCancel) + ?[JFFAsyncOpFinishedByCancellationError new] + :[JFFAsyncOpFinishedByUnsubscriptionError new]; +} + +@end diff --git a/lib/JFFAsyncOperations/Errors/JFFAsyncOperationError.h b/lib/JFFAsyncOperations/Errors/JFFAsyncOperationError.h new file mode 100644 index 0000000..e7d5d97 --- /dev/null +++ b/lib/JFFAsyncOperations/Errors/JFFAsyncOperationError.h @@ -0,0 +1,4 @@ +#import + +@interface JFFAsyncOperationError : JFFError +@end diff --git a/lib/JFFAsyncOperations/Errors/JFFAsyncOperationError.m b/lib/JFFAsyncOperations/Errors/JFFAsyncOperationError.m new file mode 100644 index 0000000..f417967 --- /dev/null +++ b/lib/JFFAsyncOperations/Errors/JFFAsyncOperationError.m @@ -0,0 +1,10 @@ +#import "JFFAsyncOperationError.h" + +@implementation JFFAsyncOperationError + ++ (NSString *)jffErrorsDomain +{ + return @"com.just_for_fun.jff_async_operations.library"; +} + +@end diff --git a/lib/JFFAsyncOperations/Errors/JFFFileDescriptorReaderError.h b/lib/JFFAsyncOperations/Errors/JFFFileDescriptorReaderError.h new file mode 100644 index 0000000..8bc5496 --- /dev/null +++ b/lib/JFFAsyncOperations/Errors/JFFFileDescriptorReaderError.h @@ -0,0 +1,4 @@ +#import + +@interface JFFFileDescriptorReaderError : JFFAsyncOperationError +@end diff --git a/lib/JFFAsyncOperations/Errors/JFFFileDescriptorReaderError.m b/lib/JFFAsyncOperations/Errors/JFFFileDescriptorReaderError.m new file mode 100644 index 0000000..32e8482 --- /dev/null +++ b/lib/JFFAsyncOperations/Errors/JFFFileDescriptorReaderError.m @@ -0,0 +1,10 @@ +#import "JFFFileDescriptorReaderError.h" + +@implementation JFFFileDescriptorReaderError + +- (instancetype)init +{ + return [self initWithDescription:NSLocalizedString(@"JFF_ASYNC_OPERATION_FILE_DESCRIPTOR_ERROR", nil)]; +} + +@end diff --git a/lib/JFFAsyncOperations/Helpers/JFFAsyncOperationHandlerBlockHolder.h b/lib/JFFAsyncOperations/Helpers/JFFAsyncOperationHandlerBlockHolder.h new file mode 100644 index 0000000..b6345ca --- /dev/null +++ b/lib/JFFAsyncOperations/Helpers/JFFAsyncOperationHandlerBlockHolder.h @@ -0,0 +1,13 @@ +#import + +#import + +@interface JFFAsyncOperationHandlerBlockHolder : NSObject + +@property (nonatomic, copy) JFFAsyncOperationHandler loaderHandler; +@property (nonatomic, copy, readonly) JFFAsyncOperationHandler smartLoaderHandler; + +- (void)performCancelBlockOnceWithArgument:(JFFAsyncOperationHandlerTask)task; +- (void)performHandlerWithArgument:(JFFAsyncOperationHandlerTask)task; + +@end diff --git a/lib/JFFAsyncOperations/Helpers/JFFAsyncOperationHandlerBlockHolder.m b/lib/JFFAsyncOperations/Helpers/JFFAsyncOperationHandlerBlockHolder.m new file mode 100644 index 0000000..b88fe7f --- /dev/null +++ b/lib/JFFAsyncOperations/Helpers/JFFAsyncOperationHandlerBlockHolder.m @@ -0,0 +1,33 @@ +#import "JFFAsyncOperationHandlerBlockHolder.h" + +@implementation JFFAsyncOperationHandlerBlockHolder + +- (void)performCancelBlockOnceWithArgument:(JFFAsyncOperationHandlerTask)task +{ + NSParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); + + if (!_loaderHandler) + return; + + JFFAsyncOperationHandler block = _loaderHandler; + _loaderHandler = nil; + block(task); +} + +- (void)performHandlerWithArgument:(JFFAsyncOperationHandlerTask)task +{ + if (task <= JFFAsyncOperationHandlerTaskCancel) + [self performCancelBlockOnceWithArgument:task]; + else + _loaderHandler(task); +} + +- (JFFAsyncOperationHandler)smartLoaderHandler +{ + return ^void(JFFAsyncOperationHandlerTask task) { + + [self performHandlerWithArgument:task]; + }; +} + +@end diff --git a/lib/JFFAsyncOperations/Helpers/JFFAsyncOperationProgressBlockHolder.h b/lib/JFFAsyncOperations/Helpers/JFFAsyncOperationProgressBlockHolder.h index 2390399..afef893 100644 --- a/lib/JFFAsyncOperations/Helpers/JFFAsyncOperationProgressBlockHolder.h +++ b/lib/JFFAsyncOperations/Helpers/JFFAsyncOperationProgressBlockHolder.h @@ -4,7 +4,7 @@ @interface JFFAsyncOperationProgressBlockHolder : NSObject -@property (nonatomic, copy) JFFAsyncOperationProgressHandler progressBlock; +@property (nonatomic, copy) JFFAsyncOperationProgressCallback progressBlock; - (void)performProgressBlockWithArgument:(id)progressInfo; diff --git a/lib/JFFAsyncOperations/Helpers/JFFCancelAsyncOperationBlockHolder.h b/lib/JFFAsyncOperations/Helpers/JFFCancelAsyncOperationBlockHolder.h deleted file mode 100644 index 3bbe232..0000000 --- a/lib/JFFAsyncOperations/Helpers/JFFCancelAsyncOperationBlockHolder.h +++ /dev/null @@ -1,10 +0,0 @@ -#import - -#import - -@interface JFFCancelAsyncOperationBlockHolder : NSObject - -@property (nonatomic, copy) JFFCancelAsyncOperation cancelBlock; -@property (nonatomic, copy, readonly) JFFCancelAsyncOperation onceCancelBlock; - -@end diff --git a/lib/JFFAsyncOperations/Helpers/JFFCancelAsyncOperationBlockHolder.m b/lib/JFFAsyncOperations/Helpers/JFFCancelAsyncOperationBlockHolder.m deleted file mode 100755 index 3165f65..0000000 --- a/lib/JFFAsyncOperations/Helpers/JFFCancelAsyncOperationBlockHolder.m +++ /dev/null @@ -1,22 +0,0 @@ -#import "JFFCancelAsyncOperationBlockHolder.h" - -@implementation JFFCancelAsyncOperationBlockHolder - -- (void)performCancelBlockOnceWithArgument:(BOOL)cancel -{ - if (!_cancelBlock) - return; - - JFFCancelAsyncOperation block = _cancelBlock; - _cancelBlock = nil; - block(cancel); -} - -- (JFFCancelAsyncOperation)onceCancelBlock -{ - return ^void(BOOL cancel) { - [self performCancelBlockOnceWithArgument:cancel]; - }; -} - -@end diff --git a/lib/JFFAsyncOperations/Helpers/JFFDidFinishAsyncOperationBlockHolder.h b/lib/JFFAsyncOperations/Helpers/JFFDidFinishAsyncOperationBlockHolder.h index 9f619ba..cab2a0b 100755 --- a/lib/JFFAsyncOperations/Helpers/JFFDidFinishAsyncOperationBlockHolder.h +++ b/lib/JFFAsyncOperations/Helpers/JFFDidFinishAsyncOperationBlockHolder.h @@ -4,7 +4,7 @@ @interface JFFDidFinishAsyncOperationBlockHolder : NSObject -@property (nonatomic, copy) JFFDidFinishAsyncOperationHandler didFinishBlock; -@property (nonatomic, copy, readonly) JFFDidFinishAsyncOperationHandler onceDidFinishBlock; +@property (nonatomic, copy) JFFDidFinishAsyncOperationCallback didFinishBlock; +@property (nonatomic, copy, readonly) JFFDidFinishAsyncOperationCallback onceDidFinishBlock; @end diff --git a/lib/JFFAsyncOperations/Helpers/JFFDidFinishAsyncOperationBlockHolder.m b/lib/JFFAsyncOperations/Helpers/JFFDidFinishAsyncOperationBlockHolder.m index c3ad68a..a64ae16 100755 --- a/lib/JFFAsyncOperations/Helpers/JFFDidFinishAsyncOperationBlockHolder.m +++ b/lib/JFFAsyncOperations/Helpers/JFFDidFinishAsyncOperationBlockHolder.m @@ -7,12 +7,12 @@ - (void)performDidFinishBlockOnceWithResult:(id)result error:(NSError *)error if (!_didFinishBlock) return; - JFFDidFinishAsyncOperationHandler block = _didFinishBlock; + JFFDidFinishAsyncOperationCallback block = _didFinishBlock; _didFinishBlock = nil; block(result, error); } -- (JFFDidFinishAsyncOperationHandler)onceDidFinishBlock +- (JFFDidFinishAsyncOperationCallback)onceDidFinishBlock { return ^(id result, NSError *error) { [self performDidFinishBlockOnceWithResult:result error:error]; diff --git a/lib/JFFAsyncOperations/JFFAsyncOperationContinuity.m b/lib/JFFAsyncOperations/JFFAsyncOperationContinuity.m index 94d73e2..f87ddca 100755 --- a/lib/JFFAsyncOperations/JFFAsyncOperationContinuity.m +++ b/lib/JFFAsyncOperations/JFFAsyncOperationContinuity.m @@ -1,8 +1,11 @@ #import "JFFAsyncOperationContinuity.h" -#import "JFFCancelAsyncOperationBlockHolder.h" -#import "JFFAsyncOperationsPredefinedBlocks.h" #import "NSError+ResultOwnerships.h" +#import "JFFAsyncOperationsPredefinedBlocks.h" +#import "JFFAsyncOperationHandlerBlockHolder.h" + +#import "JFFAsyncOpFinishedByCancellationError.h" +#import "JFFAsyncOpFinishedByUnsubscriptionError.h" #import "JFFAsyncOperationHelpers.h" @@ -25,8 +28,8 @@ + (instancetype)sharedWaterwallFirstObject @end -typedef JFFAsyncOperationBinder (*MergeTwoBindersPtr)( JFFAsyncOperationBinder, JFFAsyncOperationBinder ); -typedef JFFAsyncOperation (*MergeTwoLoadersPtr)( JFFAsyncOperation, JFFAsyncOperation ); +typedef JFFAsyncOperationBinder (*MergeTwoBindersPtr)(JFFAsyncOperationBinder, JFFAsyncOperationBinder); +typedef JFFAsyncOperation (*MergeTwoLoadersPtr)(JFFAsyncOperation, JFFAsyncOperation); static JFFAsyncOperationBinder MergeBinders(MergeTwoBindersPtr merger, NSArray *blocks) { @@ -61,39 +64,87 @@ JFFAsyncOperationBinder bindSequenceOfBindersPair(JFFAsyncOperationBinder firstB JFFAsyncOperation firstLoader = firstBinder(bindResult); NSCAssert(firstLoader, @"firstLoader should not be nil"); - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { - __block JFFCancelAsyncOperation cancelBlockHolder; + __block JFFAsyncOperationHandler handlerBlockHolder; - progressCallback = [progressCallback copy]; - doneCallback = [doneCallback copy]; + __block JFFAsyncOperationProgressCallback progressCallbackHolder = [progressCallback copy]; + __block JFFAsyncOperationChangeStateCallback stateCallbackHolder = [stateCallback copy]; + __block JFFDidFinishAsyncOperationCallback doneCallbackHolder = [doneCallback copy]; - JFFCancelAsyncOperation firstCancel = firstLoader(progressCallback, - cancelCallback, - ^void(id result, NSError *error) { + JFFAsyncOperationProgressCallback progressCallbackWrapper = ^(id progressInfo) { + + if (progressCallbackHolder) + progressCallbackHolder(progressInfo); + }; + JFFAsyncOperationChangeStateCallback stateCallbackWrapper = ^(JFFAsyncOperationState state) { + + if (stateCallbackHolder) + stateCallbackHolder(state); + }; + JFFDidFinishAsyncOperationCallback doneCallbackWrapper = ^(id result, NSError *error) { + + if (doneCallbackHolder) { + + doneCallbackHolder(result, error); + doneCallbackHolder = nil; + } + + progressCallbackHolder = nil; + stateCallbackHolder = nil; + handlerBlockHolder = nil; + }; + + __block BOOL finished = NO; + + JFFDidFinishAsyncOperationCallback fistLoaderDoneCallback = ^void(id result, NSError *error) { + if (error) { - if (doneCallback) - doneCallback(nil, error); + + finished = YES; + doneCallbackWrapper(nil, error); } else { JFFAsyncOperation secondLoader = secondBinder(result); NSCAssert(secondLoader, @"secondLoader should not be nil");//result loader should not be nil - cancelBlockHolder = secondLoader(progressCallback, - cancelCallback, - doneCallback); + handlerBlockHolder = secondLoader(progressCallbackWrapper, + stateCallbackWrapper, + doneCallbackWrapper); } - }); + }; + + JFFAsyncOperationHandler firstCancel = firstLoader(progressCallbackWrapper, + stateCallbackWrapper, + fistLoaderDoneCallback); - if (!cancelBlockHolder) - cancelBlockHolder = firstCancel; + if (finished) + return JFFStubHandlerAsyncOperationBlock; - return ^(BOOL canceled) { - JFFCancelAsyncOperation cancel = cancelBlockHolder; - if (!cancel) + if (!handlerBlockHolder) + handlerBlockHolder = firstCancel; + + return ^(JFFAsyncOperationHandlerTask task) { + + JFFAsyncOperationHandler currentHandler = handlerBlockHolder; + + if (!currentHandler) return; - cancelBlockHolder = nil; - cancel(canceled); + + if (task <= JFFAsyncOperationHandlerTaskCancel) { + + handlerBlockHolder = nil; + } + + if (task != JFFAsyncOperationHandlerTaskUnSubscribe) + currentHandler(task); + + if (task <= JFFAsyncOperationHandlerTaskCancel) { + + progressCallbackHolder = nil; + stateCallbackHolder = nil; + doneCallbackHolder = nil; + } }; }; }; @@ -146,11 +197,11 @@ JFFAsyncOperation accumulateSequenceResult(NSArray *loaders, JFFSequenceResultAc NSArray *binders = [NSArray arrayWithSize:[loaders count] producer:^id(NSUInteger index) { + JFFAsyncOperation loader = loaders[index]; + JFFAsyncOperationBinder binder = [^JFFAsyncOperation(id waterfallResult) { - JFFAsyncOperation loader = loaders[index]; - - return asyncOperationWithFinishHookBlock(loader, ^void(id result, NSError *error, JFFDidFinishAsyncOperationHandler doneCallback) { + return asyncOperationWithFinishHookBlock(loader, ^void(id result, NSError *error, JFFDidFinishAsyncOperationCallback doneCallback) { id currWaterfallResult = [waterfallResult isKindOfClass:[JFFWaterwallFirstObject class]] ?nil @@ -160,8 +211,7 @@ JFFAsyncOperation accumulateSequenceResult(NSArray *loaders, JFFSequenceResultAc error = newResult?nil:error; NSCAssert((newResult != nil) ^ (error != nil), nil); - if (doneCallback) - doneCallback(newResult, error); + doneCallback(newResult, error); }); } copy]; @@ -273,37 +323,86 @@ static JFFAsyncOperationBinder bindTrySequenceOfBindersPair(JFFAsyncOperationBin if (secondBinder == nil) return firstBinder; - return ^JFFAsyncOperation(id data) { - JFFAsyncOperation firstLoader = firstBinder(data); + return ^JFFAsyncOperation(id binderResult) { + + JFFAsyncOperation firstLoader = firstBinder(binderResult); NSCAssert(firstLoader, @"expected loader"); - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + __block JFFAsyncOperationHandler handlerBlockHolder; + + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { - __block JFFCancelAsyncOperation cancelBlockHolder; + __block JFFAsyncOperationProgressCallback progressCallbackHolder = [progressCallback copy]; + __block JFFAsyncOperationChangeStateCallback stateCallbackHolder = [stateCallback copy]; + __block JFFDidFinishAsyncOperationCallback doneCallbackHolder = [doneCallback copy]; - doneCallback = [doneCallback copy]; + JFFAsyncOperationProgressCallback progressCallbackWrapper = ^(id progressInfo) { + + if (progressCallbackHolder) + progressCallbackHolder(progressInfo); + }; + JFFAsyncOperationChangeStateCallback stateCallbackWrapper = ^(JFFAsyncOperationState state) { + + if (stateCallbackHolder) + stateCallbackHolder(state); + }; + JFFDidFinishAsyncOperationCallback doneCallbackWrapper = ^(id result, NSError *error) { + + if (doneCallbackHolder) { + + doneCallbackHolder(result, error); + doneCallbackHolder = nil; + } + + progressCallbackHolder = nil; + stateCallbackHolder = nil; + handlerBlockHolder = nil; + }; - JFFCancelAsyncOperation firstCancel = firstLoader(progressCallback, - cancelCallback, - ^void(id result, NSError *error) { + JFFAsyncOperationHandler firstHandler = firstLoader(progressCallbackWrapper, + stateCallbackWrapper, + ^void(id result, NSError *error) { + if (error) { + + if ([error isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]]) { + + doneCallbackWrapper(nil, error); + return; + } + JFFAsyncOperation secondLoader = secondBinder(error); - cancelBlockHolder = secondLoader(progressCallback, cancelCallback, doneCallback); + handlerBlockHolder = secondLoader(progressCallbackWrapper, stateCallbackWrapper, doneCallbackWrapper); } else { - if (doneCallback) - doneCallback(result, nil); + + doneCallbackWrapper(result, nil); } }); - if (!cancelBlockHolder) - cancelBlockHolder = firstCancel; - return ^(BOOL canceled) { - if (!cancelBlockHolder) + if (!handlerBlockHolder) + handlerBlockHolder = firstHandler; + + return ^(JFFAsyncOperationHandlerTask task) { + + if (!handlerBlockHolder) return; - cancelBlockHolder(canceled); - cancelBlockHolder = nil; + + JFFAsyncOperationHandler currentHandler = handlerBlockHolder; + + if (task <= JFFAsyncOperationHandlerTaskCancel) + handlerBlockHolder = nil; + + if (task != JFFAsyncOperationHandlerTaskUnSubscribe) + currentHandler(task); + + if (task <= JFFAsyncOperationHandlerTaskCancel) { + + progressCallbackHolder = nil; + stateCallbackHolder = nil; + doneCallbackHolder = nil; + } }; }; }; @@ -385,7 +484,7 @@ JFFAsyncOperation bindTrySequenceOfAsyncOperationsArray(JFFAsyncOperation firstL return MergeBinders(bindTrySequenceOfBindersPair, binders)(nil); } -static void notifyGroupResult(JFFDidFinishAsyncOperationHandler doneCallback, +static void notifyGroupResult(JFFDidFinishAsyncOperationCallback doneCallback, NSArray *complexResult, NSError *error) { @@ -395,7 +494,7 @@ static void notifyGroupResult(JFFDidFinishAsyncOperationHandler doneCallback, NSMutableArray *finalResult; if (!error) { NSArray *firstResult = complexResult[0]; - finalResult = [[NSMutableArray alloc]initWithCapacity:[firstResult count] + 1]; + finalResult = [[NSMutableArray alloc] initWithCapacity:[firstResult count] + 1]; [finalResult addObjectsFromArray:firstResult]; [finalResult addObject:complexResult[1]]; } @@ -413,9 +512,10 @@ static JFFAsyncOperation groupOfAsyncOperationsPair(JFFAsyncOperation firstLoade if (secondLoader == nil) return firstLoader; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { + __block BOOL loaded = NO; __block NSError *errorHolder; @@ -423,11 +523,43 @@ static JFFAsyncOperation groupOfAsyncOperationsPair(JFFAsyncOperation firstLoade doneCallback = [doneCallback copy]; - JFFDidFinishAsyncOperationHandler (^makeResultHandler)(NSUInteger) = - ^JFFDidFinishAsyncOperationHandler(NSUInteger index) { + __block BOOL blockCanceledOrUnsubscribed = NO; + __block JFFAsyncOperationHandlerTask finishTask = JFFAsyncOperationHandlerTaskUndefined; + + __block JFFAsyncOperationHandlerBlockHolder *handlerHolder1 = [JFFAsyncOperationHandlerBlockHolder new]; + __block JFFAsyncOperationHandlerBlockHolder *handlerHolder2 = [JFFAsyncOperationHandlerBlockHolder new]; + + JFFDidFinishAsyncOperationCallback (^makeResultHandler)(NSUInteger) = + ^JFFDidFinishAsyncOperationCallback(NSUInteger index) { return ^void(id result, NSError *error) { + BOOL cancellation = [error isKindOfClass:[JFFAsyncOperationAbstractFinishError class]]; + + if (cancellation) { + + if (blockCanceledOrUnsubscribed) + return; + + JFFAsyncOperationHandlerBlockHolder *otherHandlerHolder = (index == 0) + ?handlerHolder2 + :handlerHolder1; + + blockCanceledOrUnsubscribed = cancellation; + + finishTask = ([error isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]]) + ?JFFAsyncOperationHandlerTaskCancel + :JFFAsyncOperationHandlerTaskUnSubscribe; + [otherHandlerHolder performCancelBlockOnceWithArgument:finishTask]; + + handlerHolder1 = nil; + handlerHolder2 = nil; + + if (doneCallback) + doneCallback(nil, error); + return; + } + if (result) complexResult[index] = result; @@ -442,10 +574,19 @@ static JFFAsyncOperation groupOfAsyncOperationsPair(JFFAsyncOperation firstLoade errorHolder.resultOwnerships = nil; } + handlerHolder1 = nil; + handlerHolder2 = nil; + notifyGroupResult(doneCallback, complexResult, error); error.resultOwnerships = nil; return; + } else { + + if (index == 0) + handlerHolder1 = nil; + else + handlerHolder2 = nil; } loaded = YES; @@ -454,77 +595,46 @@ static JFFAsyncOperation groupOfAsyncOperationsPair(JFFAsyncOperation firstLoade }; }; - __block BOOL blockCanceled = NO; - - cancelCallback = [cancelCallback copy]; - JFFCancelAsyncOperationHandler (^makeCancelHandler)(JFFCancelAsyncOperationBlockHolder *) = - ^(JFFCancelAsyncOperationBlockHolder *cancelHolder) { - return ^void(BOOL canceled) { - if (!blockCanceled) { - blockCanceled = YES; - cancelHolder.onceCancelBlock(canceled); - if (cancelCallback) - cancelCallback(canceled); - } - }; - }; - - JFFDidFinishAsyncOperationHandler (^makeFinishHandler)(JFFCancelAsyncOperationBlockHolder*, NSUInteger) = - ^JFFDidFinishAsyncOperationHandler(JFFCancelAsyncOperationBlockHolder *cancelHolder, - NSUInteger index) { - JFFDidFinishAsyncOperationHandler handler = makeResultHandler(index); - return ^void(id result, NSError *error ) { - cancelHolder.cancelBlock = nil; - handler(result, error ); - }; - }; - - JFFCancelAsyncOperationBlockHolder *cancelHolder1 = [JFFCancelAsyncOperationBlockHolder new]; - JFFCancelAsyncOperationBlockHolder *cancelHolder2 = [JFFCancelAsyncOperationBlockHolder new]; - - JFFCancelAsyncOperationHandler cancelCallbackOfFirstLoader = makeCancelHandler(cancelHolder2); + JFFAsyncOperationHandler loaderHandler = firstLoader(progressCallback, + stateCallback, + makeResultHandler(0)); - __block NSNumber *firstLoaderCancelFlag = NO; - JFFCancelAsyncOperationHandler cancelCallbackOfFirstLoaderWrapper = ^void(BOOL canceled) { + if (blockCanceledOrUnsubscribed) { - firstLoaderCancelFlag = @(canceled); - cancelCallbackOfFirstLoader(canceled); - }; + if (finishTask == JFFAsyncOperationHandlerTaskUnSubscribe) { + + secondLoader(nil, nil, nil); + } + return JFFStubHandlerAsyncOperationBlock; + } - cancelHolder1.cancelBlock = firstLoader(progressCallback, - cancelCallbackOfFirstLoaderWrapper, - makeFinishHandler(cancelHolder1, 0)); + handlerHolder1.loaderHandler = loaderHandler; - cancelHolder2.cancelBlock = secondLoader(progressCallback, - makeCancelHandler(cancelHolder1), - makeFinishHandler(cancelHolder2, 1)); + loaderHandler = secondLoader(progressCallback, + stateCallback, + makeResultHandler(1)); - if (firstLoaderCancelFlag) { + if (blockCanceledOrUnsubscribed) { - cancelHolder2.cancelBlock([firstLoaderCancelFlag boolValue]); - return JFFStubCancelAsyncOperationBlock; + return JFFStubHandlerAsyncOperationBlock; } - return ^void(BOOL cancel) { + handlerHolder2.loaderHandler = loaderHandler; + + return ^void(JFFAsyncOperationHandlerTask task) { - if (!blockCanceled) { - blockCanceled = YES; - cancelHolder1.onceCancelBlock(cancel); - cancelHolder2.onceCancelBlock(cancel); - if (cancelCallback) - cancelCallback(cancel); - } + [handlerHolder1 performHandlerWithArgument:task]; + [handlerHolder2 performHandlerWithArgument:task]; }; }; } static JFFAsyncOperation resultToArrayForLoader(JFFAsyncOperation loader) { - JFFAnalyzer analyzer = ^(id result, NSError **error) { - return @[result]; - }; - JFFAsyncOperationBinder secondLoaderBinder = asyncOperationBinderWithAnalyzer(analyzer); - return bindSequenceOfAsyncOperations(loader, secondLoaderBinder, nil); + return bindSequenceOfAsyncOperations(loader, ^(id result) { + + return asyncOperationWithResult(@[result]); + }, nil); } static JFFAsyncOperation MergeGroupLoaders(MergeTwoLoadersPtr merger, NSArray *blocks) @@ -563,12 +673,12 @@ JFFAsyncOperation groupOfAsyncOperations(JFFAsyncOperation firstLoader, ...) return groupOfAsyncOperationsArray(loaders); } -static JFFDidFinishAsyncOperationHandler cancelSafeResultBlock(JFFDidFinishAsyncOperationHandler resultBlock, - JFFCancelAsyncOperationBlockHolder *cancelHolder) +static JFFDidFinishAsyncOperationCallback cancelSafeResultBlock(JFFDidFinishAsyncOperationCallback resultBlock, + JFFAsyncOperationHandlerBlockHolder *cancelHolder) { resultBlock = [resultBlock copy]; return ^void(id result, NSError *error) { - cancelHolder.cancelBlock = nil; + cancelHolder.loaderHandler = nil; resultBlock(result, error); }; } @@ -584,92 +694,94 @@ static JFFAsyncOperation failOnFirstErrorGroupOfAsyncOperationsPair(JFFAsyncOper if (secondLoader == nil) return firstLoader; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { - __block BOOL loaded = NO; - - JFFCancelAsyncOperationBlockHolder *cancelHolder1 = [JFFCancelAsyncOperationBlockHolder new]; - JFFCancelAsyncOperationBlockHolder *cancelHolder2 = [JFFCancelAsyncOperationBlockHolder new]; + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { - cancelCallback = [cancelCallback copy]; - __block JFFCancelAsyncOperationHandler cancelCallbackHolder = [^(BOOL canceled) { - if (cancelCallback) - cancelCallback(canceled); - } copy];// "cancelCallbackHolder" used as flag for done + __block JFFAsyncOperationHandlerBlockHolder *handlerHolder1 = [JFFAsyncOperationHandlerBlockHolder new]; + __block JFFAsyncOperationHandlerBlockHolder *handlerHolder2 = [JFFAsyncOperationHandlerBlockHolder new]; NSMutableArray *complexResult = [@[[NSNull null], [NSNull null]] mutableCopy]; + __block NSUInteger resultCount = 0; + __block BOOL blockCanceledOrUnsubscribed = NO; + __block JFFAsyncOperationHandlerTask finishTask = JFFAsyncOperationHandlerTaskUndefined; + doneCallback = [doneCallback copy]; - JFFDidFinishAsyncOperationHandler (^makeResultHandler)(NSUInteger) = - ^JFFDidFinishAsyncOperationHandler(NSUInteger index) { + JFFDidFinishAsyncOperationCallback (^makeResultHandler)(NSUInteger) = + ^JFFDidFinishAsyncOperationCallback(NSUInteger index) { + return ^void(id result, NSError *error) { - if (result) - complexResult[index] = result; - BOOL firstError = error && cancelCallbackHolder; - if (loaded || firstError) { - cancelCallbackHolder = nil; + + if (error) { - if (firstError) { - cancelHolder1.onceCancelBlock(YES); - cancelHolder2.onceCancelBlock(YES); - } + if (blockCanceledOrUnsubscribed) + return; - notifyGroupResult(doneCallback, complexResult, error); + JFFAsyncOperationHandlerBlockHolder *otherHandlerHolder = (index == 0) + ?handlerHolder2 + :handlerHolder1; + + blockCanceledOrUnsubscribed = YES; + finishTask = [error isKindOfClass:[JFFAsyncOpFinishedByUnsubscriptionError class]] + ?JFFAsyncOperationHandlerTaskUnSubscribe + :JFFAsyncOperationHandlerTaskCancel; + [otherHandlerHolder performCancelBlockOnceWithArgument:finishTask]; + + handlerHolder1 = nil; + handlerHolder2 = nil; + + if (doneCallback) + doneCallback(nil, error); return; } - loaded = YES; - }; - }; - - JFFCancelAsyncOperationHandler (^makeCancelCallback)(JFFCancelAsyncOperationBlockHolder *) = - ^(JFFCancelAsyncOperationBlockHolder *cancelHolder) { - return ^void(BOOL canceled) { - if (cancelCallbackHolder) { - cancelHolder.onceCancelBlock(canceled); - if (cancelCallbackHolder) { - cancelCallbackHolder(canceled); - cancelCallbackHolder = nil; - } + + complexResult[index] = result; + resultCount += 1; + + if (resultCount == 2) { + + handlerHolder1 = nil; + handlerHolder2 = nil; + + notifyGroupResult(doneCallback, complexResult, nil); + return; } }; }; - JFFCancelAsyncOperationHandler cancelCallbackOfFirstLoader = makeCancelCallback(cancelHolder2); + JFFAsyncOperationHandler loaderHandler = firstLoader(progressCallback, + stateCallback, + [makeResultHandler(0) copy] + ); - __block NSNumber *firstLoaderCancelFlag = NO; - JFFCancelAsyncOperationHandler cancelCallbackOfFirstLoaderWrapper = ^void(BOOL canceled) { + if (blockCanceledOrUnsubscribed) { - firstLoaderCancelFlag = @(canceled); - cancelCallbackOfFirstLoader(canceled); - }; + if (finishTask == JFFAsyncOperationHandlerTaskUnSubscribe) { + + secondLoader(nil, nil, nil); + } + return JFFStubHandlerAsyncOperationBlock; + } - cancelHolder1.cancelBlock = firstLoader(progressCallback, - cancelCallbackOfFirstLoaderWrapper, - cancelSafeResultBlock(makeResultHandler(0), - cancelHolder1)); + handlerHolder1.loaderHandler = loaderHandler; - cancelHolder2.cancelBlock = secondLoader(progressCallback, - makeCancelCallback(cancelHolder1), - cancelSafeResultBlock(makeResultHandler(1), - cancelHolder2)); + loaderHandler = secondLoader(progressCallback, + stateCallback, + [makeResultHandler(1) copy] + ); - if (firstLoaderCancelFlag) { + if (blockCanceledOrUnsubscribed) { - cancelHolder2.cancelBlock([firstLoaderCancelFlag boolValue]); - return JFFStubCancelAsyncOperationBlock; + return JFFStubHandlerAsyncOperationBlock; } - return ^void(BOOL cancel) { - if (cancelCallbackHolder) { - JFFCancelAsyncOperationHandler tmpCancelCallback = [cancelCallbackHolder copy]; - cancelCallbackHolder = nil; - - cancelHolder1.onceCancelBlock(cancel); - cancelHolder2.onceCancelBlock(cancel); - - tmpCancelCallback(cancel); - } + handlerHolder2.loaderHandler = loaderHandler; + + return ^void(JFFAsyncOperationHandlerTask task) { + + [handlerHolder1 performHandlerWithArgument:task]; + [handlerHolder2 performHandlerWithArgument:task]; }; }; } @@ -705,25 +817,17 @@ JFFAsyncOperation asyncOperationWithDoneBlock(JFFAsyncOperation loader, return loader; doneCallbackHook = [doneCallbackHook copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { - - cancelCallback = [cancelCallback copy]; - JFFCancelAsyncOperationHandler wrappedCancelCallback = ^void(BOOL canceled) { - doneCallbackHook(); - - if (cancelCallback) - cancelCallback(canceled); - }; + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { doneCallback = [doneCallback copy]; - JFFDidFinishAsyncOperationHandler wrappedDoneCallback = ^void(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback wrappedDoneCallback = ^void(id result, NSError *error) { doneCallbackHook(); if (doneCallback) doneCallback(result, error); }; - return loader(progressCallback, wrappedCancelCallback, wrappedDoneCallback); + return loader(progressCallback, stateCallback, wrappedDoneCallback); }; } diff --git a/lib/JFFAsyncOperations/JFFAsyncOperationHandlerTask.h b/lib/JFFAsyncOperations/JFFAsyncOperationHandlerTask.h new file mode 100644 index 0000000..6724132 --- /dev/null +++ b/lib/JFFAsyncOperations/JFFAsyncOperationHandlerTask.h @@ -0,0 +1,13 @@ +#ifndef JFFAsyncOperations_JFFAsyncOperationHandlerTask_h +#define JFFAsyncOperations_JFFAsyncOperationHandlerTask_h + +typedef NS_ENUM(NSUInteger, JFFAsyncOperationHandlerTask) +{ + JFFAsyncOperationHandlerTaskUnSubscribe = 0, + JFFAsyncOperationHandlerTaskCancel = 1, + JFFAsyncOperationHandlerTaskResume = 2, + JFFAsyncOperationHandlerTaskSuspend = 3, + JFFAsyncOperationHandlerTaskUndefined = 4, +}; + +#endif //JFFAsyncOperations_JFFAsyncOperationHandlerTask_h diff --git a/lib/JFFAsyncOperations/JFFAsyncOperationHelpers.h b/lib/JFFAsyncOperations/JFFAsyncOperationHelpers.h index 9b5f5ff..3903b26 100644 --- a/lib/JFFAsyncOperations/JFFAsyncOperationHelpers.h +++ b/lib/JFFAsyncOperations/JFFAsyncOperationHelpers.h @@ -8,35 +8,35 @@ #ifdef __cplusplus extern "C" { #endif - + ///////////////////////// ADD OBSERVERS OF ASYNC OP. RESULT //////////////////////// JFFAsyncOperation asyncOperationWithResult(id result); JFFAsyncOperation asyncOperationWithError(NSError *error); - JFFAsyncOperation asyncOperationWithCancelFlag(BOOL canceled); + JFFAsyncOperation asyncOperationWithHandlerFlag(JFFAsyncOperationHandlerTask task); JFFAsyncOperation neverFinishAsyncOperation(void); JFFAsyncOperation asyncOperationWithSyncOperationInCurrentQueue(JFFSyncOperation block); - //finish_callback_block_ called before loader_'s JFFDidFinishAsyncOperationHandler + //finish_callback_block_ called before loader_'s JFFDidFinishAsyncOperationCallback JFFAsyncOperation asyncOperationWithFinishCallbackBlock(JFFAsyncOperation loader, - JFFDidFinishAsyncOperationHandler finishCallbackBlock); + JFFDidFinishAsyncOperationCallback finishCallbackBlock); - //finish_callback_hook_ called instead loader_'s JFFDidFinishAsyncOperationHandler + //finish_callback_hook_ called instead loader_'s JFFDidFinishAsyncOperationCallback JFFAsyncOperation asyncOperationWithFinishHookBlock(JFFAsyncOperation loader, JFFDidFinishAsyncOperationHook finishCallbackHook); JFFAsyncOperation asyncOperationWithStartAndFinishBlocks(JFFAsyncOperation loader, JFFSimpleBlock startBlock, - JFFDidFinishAsyncOperationHandler finishCallback); + JFFDidFinishAsyncOperationCallback finishCallback); JFFAsyncOperation asyncOperationWithOptionalStartAndFinishBlocks(JFFAsyncOperation loader, JFFSimpleBlock startBlock, - JFFDidFinishAsyncOperationHandler finishCallback); + JFFDidFinishAsyncOperationCallback finishCallback); JFFAsyncOperation asyncOperationWithStartAndDoneBlocks(JFFAsyncOperation loader, JFFSimpleBlock startBlock, - JFFSimpleBlock doneBlock); + JFFDidFinishAsyncOperationCallback doneBlock); JFFAsyncOperation asyncOperationWithAnalyzer(id data, JFFAnalyzer analyzer); @@ -58,7 +58,7 @@ extern "C" { id result, NSError *error); - JFFAsyncOperation ignorePregressLoader(JFFAsyncOperation loader); + JFFAsyncOperation ignoreProgressLoader(JFFAsyncOperation loader); JFFAsyncOperationBinder ignorePregressBinder(JFFAsyncOperationBinder binder); JFFAsyncOperation loaderWithAdditionalParalelLoaders(JFFAsyncOperation original, JFFAsyncOperation additionalLoader, ...) NS_REQUIRES_NIL_TERMINATION; @@ -66,6 +66,10 @@ extern "C" { ///////////////////////////////////// SEQUENCE ///////////////////////////////////// JFFAnalyzer analyzerAsSequenceOfAnalyzers(JFFAnalyzer firstAnalyzer, ...) NS_REQUIRES_NIL_TERMINATION; + + void processHandlerFlag(JFFAsyncOperationHandlerTask task, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback); #ifdef __cplusplus } /* closing brace for extern "C" */ diff --git a/lib/JFFAsyncOperations/JFFAsyncOperationHelpers.m b/lib/JFFAsyncOperations/JFFAsyncOperationHelpers.m index a75f007..79fa231 100644 --- a/lib/JFFAsyncOperations/JFFAsyncOperationHelpers.m +++ b/lib/JFFAsyncOperations/JFFAsyncOperationHelpers.m @@ -1,62 +1,64 @@ #import "JFFAsyncOperationHelpers.h" -#import "JFFAsyncOperationContinuity.h" -#import "JFFAsyncOperationsPredefinedBlocks.h" #import "JFFAsyncOperationBuilder.h" #import "JFFAsyncOperationInterface.h" +#import "JFFAsyncOperationContinuity.h" +#import "JFFAsyncOperationsPredefinedBlocks.h" +#import "JFFAsyncOperationAbstractFinishError.h" JFFAsyncOperation asyncOperationWithResult(id result) { NSCParameterAssert(result); - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { + if (doneCallback) doneCallback(result, nil); - return JFFStubCancelAsyncOperationBlock; + return JFFStubHandlerAsyncOperationBlock; }; } JFFAsyncOperation asyncOperationWithError(NSError *error) { - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { if (doneCallback) doneCallback(nil, error); - return JFFStubCancelAsyncOperationBlock; + return JFFStubHandlerAsyncOperationBlock; }; } -JFFAsyncOperation asyncOperationWithCancelFlag(BOOL canceled) +JFFAsyncOperation asyncOperationWithHandlerFlag(JFFAsyncOperationHandlerTask task) { - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { - if (cancelCallback) - cancelCallback(canceled); - return JFFStubCancelAsyncOperationBlock; + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { + + processHandlerFlag(task, stateCallback, doneCallback); + return JFFStubHandlerAsyncOperationBlock; }; } JFFAsyncOperation neverFinishAsyncOperation(void) { - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { __block BOOL wasCanceled = NO; - cancelCallback = [cancelCallback copy]; + stateCallback = [stateCallback copy]; - return ^(BOOL canceled) { + return ^(JFFAsyncOperationHandlerTask task) { if (wasCanceled) return; - wasCanceled = YES; - if (cancelCallback) - cancelCallback(canceled); + wasCanceled = (task <= JFFAsyncOperationHandlerTaskCancel); + + processHandlerFlag(task, stateCallback, doneCallback); }; }; } @@ -66,9 +68,9 @@ JFFAsyncOperation asyncOperationWithSyncOperationInCurrentQueue(JFFSyncOperation NSCParameterAssert(block); block = [block copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { NSError *error; id result = block(&error); NSCAssert(((result != nil) ^ (error != nil)), @"result xor error expected"); @@ -76,21 +78,22 @@ JFFAsyncOperation asyncOperationWithSyncOperationInCurrentQueue(JFFSyncOperation if (doneCallback) doneCallback(result, error); - return JFFStubCancelAsyncOperationBlock; + return JFFStubHandlerAsyncOperationBlock; }; } JFFAsyncOperation asyncOperationWithFinishCallbackBlock(JFFAsyncOperation loader, - JFFDidFinishAsyncOperationHandler finishCallbackBlock) + JFFDidFinishAsyncOperationCallback finishCallbackBlock) { NSCParameterAssert(loader); finishCallbackBlock = [finishCallbackBlock copy]; loader = [loader copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { + doneCallback = [doneCallback copy]; - return loader(progressCallback, cancelCallback, ^void(id result, NSError *error) { + return loader(progressCallback, stateCallback, ^void(id result, NSError *error) { if (finishCallbackBlock) finishCallbackBlock(result, error); if (doneCallback) @@ -104,15 +107,17 @@ JFFAsyncOperation asyncOperationWithFinishHookBlock(JFFAsyncOperation loader, { NSCParameterAssert(loader );// should not be nil" NSCParameterAssert(finishCallbackHook);// should not be nil" + finishCallbackHook = [finishCallbackHook copy]; loader = [loader copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { doneCallback = [doneCallback copy]; - return loader(progressCallback, cancelCallback, ^void(id result, NSError *error) { + return loader(progressCallback, stateCallback, ^void(id result, NSError *error) { + finishCallbackHook(result, error, doneCallback); }); }; @@ -120,54 +125,45 @@ JFFAsyncOperation asyncOperationWithFinishHookBlock(JFFAsyncOperation loader, JFFAsyncOperation asyncOperationWithStartAndFinishBlocks(JFFAsyncOperation loader, JFFSimpleBlock startBlock, - JFFDidFinishAsyncOperationHandler finishCallback) + JFFDidFinishAsyncOperationCallback finishCallback) { startBlock = [startBlock copy]; finishCallback = [finishCallback copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { if (startBlock) startBlock(); doneCallback = [doneCallback copy]; - JFFDidFinishAsyncOperationHandler wrappedDoneCallback = ^(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback wrappedDoneCallback = ^(id result, NSError *error) { if (finishCallback) finishCallback(result, error); if (doneCallback) doneCallback(result, error); }; - return loader(progressCallback, cancelCallback, wrappedDoneCallback); + return loader(progressCallback, stateCallback, wrappedDoneCallback); }; } JFFAsyncOperation asyncOperationWithOptionalStartAndFinishBlocks(JFFAsyncOperation loader, JFFSimpleBlock startBlock, - JFFDidFinishAsyncOperationHandler finishCallback) + JFFDidFinishAsyncOperationCallback finishCallback) { loader = [loader copy]; startBlock = [startBlock copy]; finishCallback = [finishCallback copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { __block BOOL loading = YES; - cancelCallback = [cancelCallback copy]; - JFFCancelAsyncOperationHandler wrappedCancelCallback = ^(BOOL canceled) { - - loading = NO; - - if (cancelCallback) - cancelCallback(canceled); - }; - doneCallback = [doneCallback copy]; - JFFDidFinishAsyncOperationHandler wrappedDoneCallback = ^(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback wrappedDoneCallback = ^(id result, NSError *error) { loading = NO; @@ -177,7 +173,7 @@ JFFAsyncOperation asyncOperationWithOptionalStartAndFinishBlocks(JFFAsyncOperati doneCallback(result, error); }; - JFFCancelAsyncOperation cancel = loader(progressCallback, wrappedCancelCallback, wrappedDoneCallback); + JFFAsyncOperationHandler cancel = loader(progressCallback, stateCallback, wrappedDoneCallback); if (loading) { @@ -187,13 +183,13 @@ JFFAsyncOperation asyncOperationWithOptionalStartAndFinishBlocks(JFFAsyncOperati return cancel; } - return JFFStubCancelAsyncOperationBlock; + return JFFStubHandlerAsyncOperationBlock; }; } JFFAsyncOperation asyncOperationWithStartAndDoneBlocks(JFFAsyncOperation loader, JFFSimpleBlock startBlock, - JFFSimpleBlock doneBlock) + JFFDidFinishAsyncOperationCallback doneBlock) { NSCParameterAssert(loader); startBlock = [startBlock copy]; @@ -201,42 +197,33 @@ JFFAsyncOperation asyncOperationWithStartAndDoneBlocks(JFFAsyncOperation loader, loader = [loader copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { if (startBlock) startBlock(); - cancelCallback = [cancelCallback copy]; - JFFCancelAsyncOperationHandler wrappedCancelCallback = ^(BOOL canceled) { - - if (doneBlock) - doneBlock(); - - if (cancelCallback) - cancelCallback(canceled); - }; - doneCallback = [doneCallback copy]; - JFFDidFinishAsyncOperationHandler wrappedDoneCallback = ^(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback wrappedDoneCallback = ^(id result, NSError *error) { if (doneBlock) - doneBlock(); + doneBlock(result, error); if (doneCallback) doneCallback(result, error); }; - return loader(progressCallback, wrappedCancelCallback, wrappedDoneCallback); + return loader(progressCallback, stateCallback, wrappedDoneCallback); }; } JFFAsyncOperation asyncOperationWithAnalyzer(id data, JFFAnalyzer analyzer) { analyzer = [analyzer copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { + NSError *localError; id localResult = analyzer(data, &localError); NSCAssert(((localResult != nil) ^ (localError != nil)), @"localResult xor localError expected"); @@ -244,7 +231,7 @@ JFFAsyncOperation asyncOperationWithAnalyzer(id data, JFFAnalyzer analyzer) if (doneCallback) doneCallback(localError?nil:localResult, localError); - return JFFStubCancelAsyncOperationBlock; + return JFFStubHandlerAsyncOperationBlock; }; } @@ -279,11 +266,11 @@ JFFAsyncOperation asyncOperationWithChangedProgress(JFFAsyncOperation loader, loader = [loader copy]; resultBuilder = [resultBuilder copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { - JFFAsyncOperationProgressHandler progressCallbackWrapper = ^(id info) { + JFFAsyncOperationProgressCallback progressCallbackWrapper = ^(id info) { if (progressCallback) { info = resultBuilder(info); @@ -291,27 +278,27 @@ JFFAsyncOperation asyncOperationWithChangedProgress(JFFAsyncOperation loader, } }; - return loader(progressCallbackWrapper, cancelCallback, doneCallback); + return loader(progressCallbackWrapper, stateCallback, doneCallback); }; } JFFAsyncOperation asyncOperationResultAsProgress(JFFAsyncOperation loader) { loader = [loader copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { progressCallback = [progressCallback copy]; doneCallback = [doneCallback copy]; - JFFDidFinishAsyncOperationHandler doneCallbackWrapper = ^(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallbackWrapper = ^(id result, NSError *error) { if (result && progressCallback) progressCallback(result); if (doneCallback) doneCallback(result, error); }; - return loader(nil, cancelCallback, doneCallbackWrapper); + return loader(nil, stateCallback, doneCallbackWrapper); }; } @@ -324,9 +311,9 @@ JFFAsyncOperation asyncOperationWithChangedError(JFFAsyncOperation loader, errorBuilder = [errorBuilder copy]; JFFDidFinishAsyncOperationHook finishCallbackHook = ^(id result, NSError *error, - JFFDidFinishAsyncOperationHandler doneCallback) { - if (doneCallback) - doneCallback(result, error?errorBuilder(error) : nil); + JFFDidFinishAsyncOperationCallback doneCallback) { + + doneCallback(result, error?errorBuilder(error) : nil); }; return asyncOperationWithFinishHookBlock(loader, finishCallbackHook); } @@ -338,9 +325,8 @@ JFFAsyncOperation asyncOperationWithResultOrError(JFFAsyncOperation loader, return asyncOperationWithFinishHookBlock(loader, ^(id localResult, NSError *localError, - JFFDidFinishAsyncOperationHandler doneCallback) { - if (doneCallback) - doneCallback(result, error); + JFFDidFinishAsyncOperationCallback doneCallback) { + doneCallback(result, error); }); } @@ -400,13 +386,14 @@ JFFAnalyzer analyzerAsSequenceOfAnalyzers(JFFAnalyzer firstAnalyzer, ...) }; } -JFFAsyncOperation ignorePregressLoader(JFFAsyncOperation loader) +JFFAsyncOperation ignoreProgressLoader(JFFAsyncOperation loader) { loader = [loader copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { - return loader(nil, cancelCallback, doneCallback); + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { + + return loader(nil, stateCallback, doneCallback); }; } @@ -414,7 +401,33 @@ JFFAsyncOperationBinder ignorePregressBinder(JFFAsyncOperationBinder binder) { binder = [binder copy]; return ^JFFAsyncOperation(id data) { + JFFAsyncOperation loader = binder(data); - return ignorePregressLoader(loader); + return ignoreProgressLoader(loader); }; } + +void processHandlerFlag(JFFAsyncOperationHandlerTask task, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) +{ + NSError *error = [JFFAsyncOperationAbstractFinishError newAsyncOperationAbstractFinishErrorWithHandlerTask:task]; + + if (error) { + + if (doneCallback) + doneCallback(nil, error); + } else { + + NSCParameterAssert(task <= JFFAsyncOperationHandlerTaskSuspend); + + if (stateCallback) { + + JFFAsyncOperationState state = (task == JFFAsyncOperationHandlerTaskSuspend) + ?JFFAsyncOperationStateSuspended + :JFFAsyncOperationStateResumed; + + stateCallback(state); + } + } +} diff --git a/lib/JFFAsyncOperations/JFFAsyncOperationState.h b/lib/JFFAsyncOperations/JFFAsyncOperationState.h new file mode 100644 index 0000000..67936ce --- /dev/null +++ b/lib/JFFAsyncOperations/JFFAsyncOperationState.h @@ -0,0 +1,10 @@ +#ifndef JFFAsyncOperations_JFFAsyncOperationState_h +#define JFFAsyncOperations_JFFAsyncOperationState_h + +typedef NS_ENUM(NSUInteger, JFFAsyncOperationState) +{ + JFFAsyncOperationStateSuspended = 0, + JFFAsyncOperationStateResumed = 1, +}; + +#endif diff --git a/lib/JFFAsyncOperations/JFFAsyncOperationUtils.h b/lib/JFFAsyncOperations/JFFAsyncOperationUtils.h index a8fc713..2cc84cf 100755 --- a/lib/JFFAsyncOperations/JFFAsyncOperationUtils.h +++ b/lib/JFFAsyncOperations/JFFAsyncOperationUtils.h @@ -3,7 +3,13 @@ #ifdef __cplusplus extern "C" { #endif - + + JFFAsyncOperation generalAsyncOperationWithSyncOperationAndQueue(JFFSyncOperation loadDataBlock, + const char *queueName, + BOOL barrier, + dispatch_queue_t currentQueue, + dispatch_queue_attr_t attr); + JFFAsyncOperation asyncOperationWithSyncOperation(JFFSyncOperation loadDataBlock); JFFAsyncOperation asyncOperationWithSyncOperationAndQueue(JFFSyncOperation loadDataBlock, diff --git a/lib/JFFAsyncOperations/JFFAsyncOperationUtils.mm b/lib/JFFAsyncOperations/JFFAsyncOperationUtils.mm index 3bf3c99..311876c 100644 --- a/lib/JFFAsyncOperations/JFFAsyncOperationUtils.mm +++ b/lib/JFFAsyncOperations/JFFAsyncOperationUtils.mm @@ -25,18 +25,18 @@ static JFFAsyncOperation asyncOperationWithSyncOperationWithProgressBlockAndQueu asyncObject.queueAttributes = attr; return asyncObject; }; - return buildAsyncOperationWithAdapterFactory(factory); + return buildAsyncOperationWithAdapterFactoryWithDispatchQueue(factory, currentQueue); } -static JFFAsyncOperation privateAsyncOperationWithSyncOperationAndQueue(JFFSyncOperation loadDataBlock, - const char *queueName, - BOOL barrier, - dispatch_queue_t currentQueue, - dispatch_queue_attr_t attr) +JFFAsyncOperation generalAsyncOperationWithSyncOperationAndQueue(JFFSyncOperation loadDataBlock, + const char *queueName, + BOOL barrier, + dispatch_queue_t currentQueue, + dispatch_queue_attr_t attr) { loadDataBlock = [loadDataBlock copy]; JFFSyncOperationWithProgress progressLoadDataBlock= ^id(NSError *__autoreleasing *error, - JFFAsyncOperationProgressHandler progressCallback) { + JFFAsyncOperationProgressCallback progressCallback) { id result = loadDataBlock(error); if (result && progressCallback) progressCallback(result); @@ -53,7 +53,7 @@ static JFFAsyncOperation privateAsyncOperationWithSyncOperationAndQueue(JFFSyncO JFFAsyncOperation asyncOperationWithSyncOperationAndQueue(JFFSyncOperation loadDataBlock, const char *queueName) { NSCParameterAssert([NSThread isMainThread]); - return privateAsyncOperationWithSyncOperationAndQueue(loadDataBlock, + return generalAsyncOperationWithSyncOperationAndQueue(loadDataBlock, queueName, NO, dispatch_get_main_queue(), @@ -64,7 +64,7 @@ JFFAsyncOperation barrierAsyncOperationWithSyncOperationAndQueue(JFFSyncOperatio const char *queueName) { NSCParameterAssert([NSThread isMainThread]); - return privateAsyncOperationWithSyncOperationAndQueue(loadDataBlock, + return generalAsyncOperationWithSyncOperationAndQueue(loadDataBlock, queueName, YES, dispatch_get_main_queue(), @@ -76,7 +76,7 @@ JFFAsyncOperation asyncOperationWithSyncOperationAndConfigurableQueue(JFFSyncOpe NSCParameterAssert([NSThread isMainThread]); dispatch_queue_attr_t attr = isSerialQueue?DISPATCH_QUEUE_SERIAL:DISPATCH_QUEUE_CONCURRENT; - return privateAsyncOperationWithSyncOperationAndQueue(loadDataBlock, + return generalAsyncOperationWithSyncOperationAndQueue(loadDataBlock, queueName, NO, dispatch_get_main_queue(), diff --git a/lib/JFFAsyncOperations/JFFAsyncOperations.h b/lib/JFFAsyncOperations/JFFAsyncOperations.h index 91ff00c..e67464e 100755 --- a/lib/JFFAsyncOperations/JFFAsyncOperations.h +++ b/lib/JFFAsyncOperations/JFFAsyncOperations.h @@ -6,7 +6,6 @@ #import #import -#import #import #import @@ -15,6 +14,11 @@ #import #import +#import #import #import + +//Errors +#import +#import diff --git a/lib/JFFAsyncOperations/JFFAsyncOperations.xcodeproj/project.pbxproj b/lib/JFFAsyncOperations/JFFAsyncOperations.xcodeproj/project.pbxproj index 2b77730..e9648f5 100644 --- a/lib/JFFAsyncOperations/JFFAsyncOperations.xcodeproj/project.pbxproj +++ b/lib/JFFAsyncOperations/JFFAsyncOperations.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 1B0857D3145169B3001DDE0A /* JFFCallbacksBlocksHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 65648BAE1392407F001E163C /* JFFCallbacksBlocksHolder.m */; }; 1B0D88C31519F81F00EC4A92 /* JFFAsyncOperationBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B0D88C11519F81F00EC4A92 /* JFFAsyncOperationBuilder.h */; }; 1B0D88C41519F81F00EC4A92 /* JFFAsyncOperationBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B0D88C21519F81F00EC4A92 /* JFFAsyncOperationBuilder.m */; }; 1B0E83A51563953300825E3C /* JFFAsyncOperationUtils.mm in Sources */ = {isa = PBXBuildFile; fileRef = 65648C391392490F001E163C /* JFFAsyncOperationUtils.mm */; }; @@ -15,14 +14,93 @@ 1B0E83AA1563954B00825E3C /* JFFAsyncOperationAdapter.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1B0E83A81563954B00825E3C /* JFFAsyncOperationAdapter.mm */; }; 1B0FB887150604860056F14E /* JFFAsyncOperationHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B0FB885150604850056F14E /* JFFAsyncOperationHelpers.h */; }; 1B0FB888150604860056F14E /* JFFAsyncOperationHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B0FB886150604850056F14E /* JFFAsyncOperationHelpers.m */; }; - 1B2A678D143F3D0E00BC284F /* NSObject+AutoCancelAsyncOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 655ADDDF13B68E45005A6D3F /* NSObject+AutoCancelAsyncOperation.m */; }; 1B2A67E5143F4CAB00BC284F /* JFFDidFinishAsyncOperationBlockHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D1B3D6E13B88A2700410ECB /* JFFDidFinishAsyncOperationBlockHolder.m */; }; - 1B2A682B143F532500BC284F /* JFFCancelAsyncOperationBlockHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 65347F6C13B7EEE50002CF73 /* JFFCancelAsyncOperationBlockHolder.m */; }; + 1B2A682B143F532500BC284F /* JFFAsyncOperationHandlerBlockHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 65347F6C13B7EEE50002CF73 /* JFFAsyncOperationHandlerBlockHolder.m */; }; 1B2A682E143F537B00BC284F /* JFFAsyncOperationProgressBlockHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 6534804B13B822F00002CF73 /* JFFAsyncOperationProgressBlockHolder.m */; }; 1B835B33142CBA2200FC004C /* JFFAsyncOperationsPredefinedBlocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B835B31142CBA2200FC004C /* JFFAsyncOperationsPredefinedBlocks.h */; }; 1B9528FC1500E67900C9B979 /* NSError+ResultOwnerships.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B9528FA1500E67900C9B979 /* NSError+ResultOwnerships.h */; }; 1B9528FD1500E67900C9B979 /* NSError+ResultOwnerships.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B9528FB1500E67900C9B979 /* NSError+ResultOwnerships.m */; }; 1BA2551C1443109B00C9B2BE /* JFFAsyncOperationContinuity.m in Sources */ = {isa = PBXBuildFile; fileRef = 651BE1661391928400DD6890 /* JFFAsyncOperationContinuity.m */; }; + 4C0C3F021826D33B00984027 /* JFFAsyncOperationError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C0C3F001826D33B00984027 /* JFFAsyncOperationError.h */; }; + 4C0C3F031826D33B00984027 /* JFFAsyncOperationError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C0C3F001826D33B00984027 /* JFFAsyncOperationError.h */; }; + 4C0C3F041826D33B00984027 /* JFFAsyncOperationError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0C3F011826D33B00984027 /* JFFAsyncOperationError.m */; }; + 4C0C3F051826D33B00984027 /* JFFAsyncOperationError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0C3F011826D33B00984027 /* JFFAsyncOperationError.m */; }; + 4C0C3F081826D39100984027 /* JFFAsyncOperationAbstractFinishError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C0C3F061826D39100984027 /* JFFAsyncOperationAbstractFinishError.h */; }; + 4C0C3F091826D39100984027 /* JFFAsyncOperationAbstractFinishError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C0C3F061826D39100984027 /* JFFAsyncOperationAbstractFinishError.h */; }; + 4C0C3F0A1826D39100984027 /* JFFAsyncOperationAbstractFinishError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0C3F071826D39100984027 /* JFFAsyncOperationAbstractFinishError.m */; }; + 4C0C3F0B1826D39100984027 /* JFFAsyncOperationAbstractFinishError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0C3F071826D39100984027 /* JFFAsyncOperationAbstractFinishError.m */; }; + 4C0C3F0E1826D3ED00984027 /* JFFAsyncOpFinishedByUnsubscriptionError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C0C3F0C1826D3ED00984027 /* JFFAsyncOpFinishedByUnsubscriptionError.h */; }; + 4C0C3F0F1826D3ED00984027 /* JFFAsyncOpFinishedByUnsubscriptionError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C0C3F0C1826D3ED00984027 /* JFFAsyncOpFinishedByUnsubscriptionError.h */; }; + 4C0C3F101826D3ED00984027 /* JFFAsyncOpFinishedByUnsubscriptionError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0C3F0D1826D3ED00984027 /* JFFAsyncOpFinishedByUnsubscriptionError.m */; }; + 4C0C3F111826D3ED00984027 /* JFFAsyncOpFinishedByUnsubscriptionError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0C3F0D1826D3ED00984027 /* JFFAsyncOpFinishedByUnsubscriptionError.m */; }; + 4C0C3F141826D60400984027 /* JFFAsyncOpFinishedByCancellationError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C0C3F121826D60400984027 /* JFFAsyncOpFinishedByCancellationError.h */; }; + 4C0C3F151826D60400984027 /* JFFAsyncOpFinishedByCancellationError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C0C3F121826D60400984027 /* JFFAsyncOpFinishedByCancellationError.h */; }; + 4C0C3F161826D60400984027 /* JFFAsyncOpFinishedByCancellationError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0C3F131826D60400984027 /* JFFAsyncOpFinishedByCancellationError.m */; }; + 4C0C3F171826D60400984027 /* JFFAsyncOpFinishedByCancellationError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0C3F131826D60400984027 /* JFFAsyncOpFinishedByCancellationError.m */; }; + 4C1A0F46182577BE0020FBF6 /* JFFAsyncOperations_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* JFFAsyncOperations_Prefix.pch */; }; + 4C1A0F47182577BE0020FBF6 /* JFFAsyncOperationsBlockDefinitions.h in Headers */ = {isa = PBXBuildFile; fileRef = 651BE1611391913300DD6890 /* JFFAsyncOperationsBlockDefinitions.h */; }; + 4C1A0F48182577BE0020FBF6 /* JFFAsyncOperationContinuity.h in Headers */ = {isa = PBXBuildFile; fileRef = 651BE1651391928400DD6890 /* JFFAsyncOperationContinuity.h */; }; + 4C1A0F4A182577BE0020FBF6 /* JFFBlockOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 65648BD313924220001E163C /* JFFBlockOperation.h */; }; + 4C1A0F4B182577BE0020FBF6 /* JFFAsyncOperationUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 65648C381392490F001E163C /* JFFAsyncOperationUtils.h */; }; + 4C1A0F4C182577BE0020FBF6 /* JFFAsyncOperations.h in Headers */ = {isa = PBXBuildFile; fileRef = 65648C5013924A77001E163C /* JFFAsyncOperations.h */; }; + 4C1A0F4E182577BE0020FBF6 /* JFFAsyncOperationHandlerBlockHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 65347F6B13B7EEE50002CF73 /* JFFAsyncOperationHandlerBlockHolder.h */; }; + 4C1A0F4F182577BE0020FBF6 /* JFFAsyncOperationLoadBalancer.h in Headers */ = {isa = PBXBuildFile; fileRef = 65347F9413B7F0BD0002CF73 /* JFFAsyncOperationLoadBalancer.h */; }; + 4C1A0F50182577BE0020FBF6 /* JFFAsyncOperationProgressBlockHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 6534804A13B822F00002CF73 /* JFFAsyncOperationProgressBlockHolder.h */; }; + 4C1A0F51182577BE0020FBF6 /* JFFDidFinishAsyncOperationBlockHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D1B3D6D13B88A2700410ECB /* JFFDidFinishAsyncOperationBlockHolder.h */; }; + 4C1A0F52182577BE0020FBF6 /* JFFPropertyPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D9827F713F2B9D5009DD73B /* JFFPropertyPath.h */; }; + 4C1A0F53182577BE0020FBF6 /* NSObject+AsyncPropertyReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D9827F913F2B9D5009DD73B /* NSObject+AsyncPropertyReader.h */; }; + 4C1A0F54182577BE0020FBF6 /* JFFPropertyExtractor.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D9827FF13F2BA10009DD73B /* JFFPropertyExtractor.h */; }; + 4C1A0F55182577BE0020FBF6 /* JFFObjectRelatedPropertyData.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D61CD2A13F2BC8A0003AC4A /* JFFObjectRelatedPropertyData.h */; }; + 4C1A0F56182577BE0020FBF6 /* NSObject+PropertyExtractor.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D61CD2F13F2BCE40003AC4A /* NSObject+PropertyExtractor.h */; }; + 4C1A0F57182577BE0020FBF6 /* JFFAsyncOperationsPredefinedBlocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B835B31142CBA2200FC004C /* JFFAsyncOperationsPredefinedBlocks.h */; }; + 4C1A0F58182577BE0020FBF6 /* NSError+ResultOwnerships.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B9528FA1500E67900C9B979 /* NSError+ResultOwnerships.h */; }; + 4C1A0F59182577BE0020FBF6 /* JFFAsyncOperationHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B0FB885150604850056F14E /* JFFAsyncOperationHelpers.h */; }; + 4C1A0F5A182577BE0020FBF6 /* JFFAsyncOperationBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B0D88C11519F81F00EC4A92 /* JFFAsyncOperationBuilder.h */; }; + 4C1A0F5B182577BE0020FBF6 /* JFFAsyncOperationAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B0E83A71563954B00825E3C /* JFFAsyncOperationAdapter.h */; }; + 4C1A0F5C182577BE0020FBF6 /* JFFLimitedLoadersQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = CE4031CA163D266A00FE6427 /* JFFLimitedLoadersQueue.h */; }; + 4C1A0F5D182577BE0020FBF6 /* JFFStrategyFifo.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E79064B16E4981700CFC696 /* JFFStrategyFifo.h */; }; + 4C1A0F5E182577BE0020FBF6 /* JFFQueueState.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E79065316E4984400CFC696 /* JFFQueueState.h */; }; + 4C1A0F5F182577BE0020FBF6 /* JFFQueueStrategyFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E79065B16E49DD900CFC696 /* JFFQueueStrategyFactory.h */; }; + 4C1A0F60182577BE0020FBF6 /* JFFStrategyStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E79066316E49F8000CFC696 /* JFFStrategyStack.h */; }; + 4C1A0F61182577BE0020FBF6 /* JFFStrategyRandom.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E79066B16E4A49B00CFC696 /* JFFStrategyRandom.h */; }; + 4C1A0F62182577BE0020FBF6 /* JFFAsyncOperationLoadBalancerContexts.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CF62FB016FDB6FE00DAE2BB /* JFFAsyncOperationLoadBalancerContexts.h */; }; + 4C1A0F63182577BE0020FBF6 /* JFFBaseStrategy.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C6DFB0C1718446500D86975 /* JFFBaseStrategy.h */; }; + 4C1A0F64182577BE0020FBF6 /* NSArray+AsyncMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CB5CDE5174F54E100F2B600 /* NSArray+AsyncMap.h */; }; + 4C1A0F65182577BE0020FBF6 /* NSDictionary+AsyncMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CB5CDE9174F551200F2B600 /* NSDictionary+AsyncMap.h */; }; + 4C1A0F68182577BE0020FBF6 /* JFFDidFinishAsyncOperationBlockHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D1B3D6E13B88A2700410ECB /* JFFDidFinishAsyncOperationBlockHolder.m */; }; + 4C1A0F69182577BE0020FBF6 /* JFFAsyncOperationHandlerBlockHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 65347F6C13B7EEE50002CF73 /* JFFAsyncOperationHandlerBlockHolder.m */; }; + 4C1A0F6A182577BE0020FBF6 /* JFFAsyncOperationProgressBlockHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 6534804B13B822F00002CF73 /* JFFAsyncOperationProgressBlockHolder.m */; }; + 4C1A0F6B182577BE0020FBF6 /* JFFAsyncOperationContinuity.m in Sources */ = {isa = PBXBuildFile; fileRef = 651BE1661391928400DD6890 /* JFFAsyncOperationContinuity.m */; }; + 4C1A0F6D182577BE0020FBF6 /* NSObject+AsyncPropertyReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D9827FA13F2B9D5009DD73B /* NSObject+AsyncPropertyReader.m */; }; + 4C1A0F6E182577BE0020FBF6 /* JFFPropertyExtractor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D98280013F2BA10009DD73B /* JFFPropertyExtractor.m */; }; + 4C1A0F6F182577BE0020FBF6 /* JFFPropertyPath.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D9827F813F2B9D5009DD73B /* JFFPropertyPath.m */; }; + 4C1A0F70182577BE0020FBF6 /* JFFObjectRelatedPropertyData.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D61CD2B13F2BC8A0003AC4A /* JFFObjectRelatedPropertyData.m */; }; + 4C1A0F71182577BE0020FBF6 /* NSObject+PropertyExtractor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D61CD3013F2BCE40003AC4A /* NSObject+PropertyExtractor.m */; }; + 4C1A0F72182577BE0020FBF6 /* JFFAsyncOperationsPredefinedBlocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B835B32142CBA2200FC004C /* JFFAsyncOperationsPredefinedBlocks.m */; }; + 4C1A0F73182577BE0020FBF6 /* JFFBlockOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 65648BD413924220001E163C /* JFFBlockOperation.mm */; }; + 4C1A0F74182577BE0020FBF6 /* NSError+ResultOwnerships.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B9528FB1500E67900C9B979 /* NSError+ResultOwnerships.m */; }; + 4C1A0F75182577BE0020FBF6 /* JFFAsyncOperationHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B0FB886150604850056F14E /* JFFAsyncOperationHelpers.m */; }; + 4C1A0F76182577BE0020FBF6 /* JFFAsyncOperationBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B0D88C21519F81F00EC4A92 /* JFFAsyncOperationBuilder.m */; }; + 4C1A0F77182577BE0020FBF6 /* JFFAsyncOperationUtils.mm in Sources */ = {isa = PBXBuildFile; fileRef = 65648C391392490F001E163C /* JFFAsyncOperationUtils.mm */; }; + 4C1A0F78182577BE0020FBF6 /* JFFAsyncOperationAdapter.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1B0E83A81563954B00825E3C /* JFFAsyncOperationAdapter.mm */; }; + 4C1A0F79182577BE0020FBF6 /* JFFLimitedLoadersQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = CE4031CB163D266B00FE6427 /* JFFLimitedLoadersQueue.m */; }; + 4C1A0F7A182577BE0020FBF6 /* JFFStrategyFifo.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E79064C16E4981700CFC696 /* JFFStrategyFifo.m */; }; + 4C1A0F7B182577BE0020FBF6 /* JFFQueueState.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E79065416E4984400CFC696 /* JFFQueueState.m */; }; + 4C1A0F7C182577BE0020FBF6 /* JFFQueueStrategyFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E79065C16E49DD900CFC696 /* JFFQueueStrategyFactory.m */; }; + 4C1A0F7D182577BE0020FBF6 /* JFFStrategyStack.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E79066416E49F8000CFC696 /* JFFStrategyStack.m */; }; + 4C1A0F7E182577BE0020FBF6 /* JFFStrategyRandom.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7E79066C16E4A49B00CFC696 /* JFFStrategyRandom.mm */; }; + 4C1A0F7F182577BE0020FBF6 /* JFFBaseLoaderOwner.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF62FB316FDB6FE00DAE2BB /* JFFBaseLoaderOwner.m */; }; + 4C1A0F80182577BE0020FBF6 /* JFFAsyncOperationLoadBalancer.m in Sources */ = {isa = PBXBuildFile; fileRef = 65347F9513B7F0BD0002CF73 /* JFFAsyncOperationLoadBalancer.m */; }; + 4C1A0F81182577BE0020FBF6 /* JFFActiveLoaderData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF62FAF16FDB6FE00DAE2BB /* JFFActiveLoaderData.m */; }; + 4C1A0F82182577BE0020FBF6 /* JFFAsyncOperationLoadBalancerContexts.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF62FB116FDB6FE00DAE2BB /* JFFAsyncOperationLoadBalancerContexts.m */; }; + 4C1A0F83182577BE0020FBF6 /* JFFContextLoaders.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF62FB516FDB6FE00DAE2BB /* JFFContextLoaders.m */; }; + 4C1A0F84182577BE0020FBF6 /* JFFPedingLoaderData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF62FB716FDB6FE00DAE2BB /* JFFPedingLoaderData.m */; }; + 4C1A0F85182577BE0020FBF6 /* JFFBaseStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6DFB0D1718446600D86975 /* JFFBaseStrategy.m */; }; + 4C1A0F86182577BE0020FBF6 /* NSArray+AsyncMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CB5CDE6174F54E100F2B600 /* NSArray+AsyncMap.m */; }; + 4C1A0F87182577BE0020FBF6 /* NSDictionary+AsyncMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CB5CDEA174F551300F2B600 /* NSDictionary+AsyncMap.m */; }; + 4C1A0F89182577BE0020FBF6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; + 4C5361F518608BD900EB89F5 /* NSObject+AutoCancelAsyncOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C5361F318608BD900EB89F5 /* NSObject+AutoCancelAsyncOperation.h */; }; + 4C5361F618608BD900EB89F5 /* NSObject+AutoCancelAsyncOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5361F418608BD900EB89F5 /* NSObject+AutoCancelAsyncOperation.m */; }; 4C6DFB0E1718446600D86975 /* JFFBaseStrategy.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C6DFB0C1718446500D86975 /* JFFBaseStrategy.h */; }; 4C6DFB0F1718446600D86975 /* JFFBaseStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6DFB0D1718446600D86975 /* JFFBaseStrategy.m */; }; 4CB5CDE7174F54E200F2B600 /* NSArray+AsyncMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CB5CDE5174F54E100F2B600 /* NSArray+AsyncMap.h */; }; @@ -50,17 +128,19 @@ 4CBBDCCE1717422D004D670D /* JFFPedingLoaderData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF62FB716FDB6FE00DAE2BB /* JFFPedingLoaderData.m */; }; 4CBBDCCF1717422E004D670D /* JFFPedingLoaderData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF62FB716FDB6FE00DAE2BB /* JFFPedingLoaderData.m */; }; 4CBBDCD01717422E004D670D /* JFFPedingLoaderData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF62FB716FDB6FE00DAE2BB /* JFFPedingLoaderData.m */; }; + 4CDB8E10182BE4AD00C5BFA3 /* JFFFileDescriptorReaderError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CDB8E0E182BE4AD00C5BFA3 /* JFFFileDescriptorReaderError.h */; }; + 4CDB8E11182BE4AD00C5BFA3 /* JFFFileDescriptorReaderError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CDB8E0E182BE4AD00C5BFA3 /* JFFFileDescriptorReaderError.h */; }; + 4CDB8E12182BE4AD00C5BFA3 /* JFFFileDescriptorReaderError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CDB8E0F182BE4AD00C5BFA3 /* JFFFileDescriptorReaderError.m */; }; + 4CDB8E13182BE4AD00C5BFA3 /* JFFFileDescriptorReaderError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CDB8E0F182BE4AD00C5BFA3 /* JFFFileDescriptorReaderError.m */; }; 4CF62FCD16FDBA3800DAE2BB /* JFFAsyncOperationLoadBalancer.m in Sources */ = {isa = PBXBuildFile; fileRef = 65347F9513B7F0BD0002CF73 /* JFFAsyncOperationLoadBalancer.m */; }; 4CF62FCE16FDBA3800DAE2BB /* JFFAsyncOperationLoadBalancer.m in Sources */ = {isa = PBXBuildFile; fileRef = 65347F9513B7F0BD0002CF73 /* JFFAsyncOperationLoadBalancer.m */; }; 5391035714A88BB5007315A3 /* JFFAsyncOperations_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* JFFAsyncOperations_Prefix.pch */; }; 5391035814A88BB5007315A3 /* JFFAsyncOperationsBlockDefinitions.h in Headers */ = {isa = PBXBuildFile; fileRef = 651BE1611391913300DD6890 /* JFFAsyncOperationsBlockDefinitions.h */; }; 5391035914A88BB5007315A3 /* JFFAsyncOperationContinuity.h in Headers */ = {isa = PBXBuildFile; fileRef = 651BE1651391928400DD6890 /* JFFAsyncOperationContinuity.h */; }; - 5391035A14A88BB5007315A3 /* JFFCallbacksBlocksHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 65648BAD1392407F001E163C /* JFFCallbacksBlocksHolder.h */; }; 5391035C14A88BB5007315A3 /* JFFBlockOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 65648BD313924220001E163C /* JFFBlockOperation.h */; }; 5391035D14A88BB5007315A3 /* JFFAsyncOperationUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 65648C381392490F001E163C /* JFFAsyncOperationUtils.h */; }; 5391035E14A88BB5007315A3 /* JFFAsyncOperations.h in Headers */ = {isa = PBXBuildFile; fileRef = 65648C5013924A77001E163C /* JFFAsyncOperations.h */; }; - 5391035F14A88BB5007315A3 /* NSObject+AutoCancelAsyncOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 655ADDDE13B68E45005A6D3F /* NSObject+AutoCancelAsyncOperation.h */; }; - 5391036014A88BB5007315A3 /* JFFCancelAsyncOperationBlockHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 65347F6B13B7EEE50002CF73 /* JFFCancelAsyncOperationBlockHolder.h */; }; + 5391036014A88BB5007315A3 /* JFFAsyncOperationHandlerBlockHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 65347F6B13B7EEE50002CF73 /* JFFAsyncOperationHandlerBlockHolder.h */; }; 5391036114A88BB5007315A3 /* JFFAsyncOperationLoadBalancer.h in Headers */ = {isa = PBXBuildFile; fileRef = 65347F9413B7F0BD0002CF73 /* JFFAsyncOperationLoadBalancer.h */; }; 5391036514A88BB5007315A3 /* JFFAsyncOperationProgressBlockHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 6534804A13B822F00002CF73 /* JFFAsyncOperationProgressBlockHolder.h */; }; 5391036714A88BB5007315A3 /* JFFDidFinishAsyncOperationBlockHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D1B3D6D13B88A2700410ECB /* JFFDidFinishAsyncOperationBlockHolder.h */; }; @@ -69,22 +149,18 @@ 5391036A14A88BB5007315A3 /* JFFPropertyExtractor.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D9827FF13F2BA10009DD73B /* JFFPropertyExtractor.h */; }; 5391036B14A88BB5007315A3 /* JFFObjectRelatedPropertyData.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D61CD2A13F2BC8A0003AC4A /* JFFObjectRelatedPropertyData.h */; }; 5391036C14A88BB5007315A3 /* NSObject+PropertyExtractor.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D61CD2F13F2BCE40003AC4A /* NSObject+PropertyExtractor.h */; }; - 5391036F14A88BB5007315A3 /* NSObject+AutoCancelAsyncOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 655ADDDF13B68E45005A6D3F /* NSObject+AutoCancelAsyncOperation.m */; }; 5391037014A88BB5007315A3 /* JFFDidFinishAsyncOperationBlockHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D1B3D6E13B88A2700410ECB /* JFFDidFinishAsyncOperationBlockHolder.m */; }; - 5391037114A88BB5007315A3 /* JFFCancelAsyncOperationBlockHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 65347F6C13B7EEE50002CF73 /* JFFCancelAsyncOperationBlockHolder.m */; }; + 5391037114A88BB5007315A3 /* JFFAsyncOperationHandlerBlockHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 65347F6C13B7EEE50002CF73 /* JFFAsyncOperationHandlerBlockHolder.m */; }; 5391037214A88BB5007315A3 /* JFFAsyncOperationProgressBlockHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 6534804B13B822F00002CF73 /* JFFAsyncOperationProgressBlockHolder.m */; }; 5391037314A88BB5007315A3 /* JFFAsyncOperationContinuity.m in Sources */ = {isa = PBXBuildFile; fileRef = 651BE1661391928400DD6890 /* JFFAsyncOperationContinuity.m */; }; - 5391037414A88BB5007315A3 /* JFFCallbacksBlocksHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 65648BAE1392407F001E163C /* JFFCallbacksBlocksHolder.m */; }; 5391037714A88BB5007315A3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; 651BE1621391913300DD6890 /* JFFAsyncOperationsBlockDefinitions.h in Headers */ = {isa = PBXBuildFile; fileRef = 651BE1611391913300DD6890 /* JFFAsyncOperationsBlockDefinitions.h */; }; 651BE1671391928400DD6890 /* JFFAsyncOperationContinuity.h in Headers */ = {isa = PBXBuildFile; fileRef = 651BE1651391928400DD6890 /* JFFAsyncOperationContinuity.h */; }; 6532667C14C1EB27004E90B0 /* JFFAsyncOperationsPredefinedBlocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B835B31142CBA2200FC004C /* JFFAsyncOperationsPredefinedBlocks.h */; }; - 65347F6D13B7EEE50002CF73 /* JFFCancelAsyncOperationBlockHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 65347F6B13B7EEE50002CF73 /* JFFCancelAsyncOperationBlockHolder.h */; }; + 65347F6D13B7EEE50002CF73 /* JFFAsyncOperationHandlerBlockHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 65347F6B13B7EEE50002CF73 /* JFFAsyncOperationHandlerBlockHolder.h */; }; 65347F9613B7F0BD0002CF73 /* JFFAsyncOperationLoadBalancer.h in Headers */ = {isa = PBXBuildFile; fileRef = 65347F9413B7F0BD0002CF73 /* JFFAsyncOperationLoadBalancer.h */; }; 6534804C13B822F00002CF73 /* JFFAsyncOperationProgressBlockHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 6534804A13B822F00002CF73 /* JFFAsyncOperationProgressBlockHolder.h */; }; 65462C9514D8811100685ED8 /* JFFBlockOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 65648BD413924220001E163C /* JFFBlockOperation.mm */; }; - 655ADDE013B68E45005A6D3F /* NSObject+AutoCancelAsyncOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 655ADDDE13B68E45005A6D3F /* NSObject+AutoCancelAsyncOperation.h */; }; - 65648BAF1392407F001E163C /* JFFCallbacksBlocksHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 65648BAD1392407F001E163C /* JFFCallbacksBlocksHolder.h */; }; 65648BD513924220001E163C /* JFFBlockOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 65648BD313924220001E163C /* JFFBlockOperation.h */; }; 65648C3A1392490F001E163C /* JFFAsyncOperationUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 65648C381392490F001E163C /* JFFAsyncOperationUtils.h */; }; 65648C5113924A77001E163C /* JFFAsyncOperations.h in Headers */ = {isa = PBXBuildFile; fileRef = 65648C5013924A77001E163C /* JFFAsyncOperations.h */; }; @@ -129,28 +205,24 @@ 7E8F20DB14F94C3100588C7D /* JFFPropertyPath.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D9827F813F2B9D5009DD73B /* JFFPropertyPath.m */; }; 7E8F20DD14F94C3100588C7D /* JFFPropertyExtractor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D98280013F2BA10009DD73B /* JFFPropertyExtractor.m */; }; 7E8F20DF14F94C3100588C7D /* NSObject+AsyncPropertyReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D9827FA13F2B9D5009DD73B /* NSObject+AsyncPropertyReader.m */; }; - 7E8F20E114F94C3100588C7D /* JFFCallbacksBlocksHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 65648BAE1392407F001E163C /* JFFCallbacksBlocksHolder.m */; }; - 7E8F20E314F94C3100588C7D /* JFFCancelAsyncOperationBlockHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 65347F6C13B7EEE50002CF73 /* JFFCancelAsyncOperationBlockHolder.m */; }; + 7E8F20E314F94C3100588C7D /* JFFAsyncOperationHandlerBlockHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 65347F6C13B7EEE50002CF73 /* JFFAsyncOperationHandlerBlockHolder.m */; }; 7E8F20E514F94C3100588C7D /* JFFAsyncOperationProgressBlockHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 6534804B13B822F00002CF73 /* JFFAsyncOperationProgressBlockHolder.m */; }; 7E8F20E714F94C3100588C7D /* JFFDidFinishAsyncOperationBlockHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D1B3D6E13B88A2700410ECB /* JFFDidFinishAsyncOperationBlockHolder.m */; }; 7E8F20F414F94C3100588C7D /* JFFAsyncOperationsPredefinedBlocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B835B32142CBA2200FC004C /* JFFAsyncOperationsPredefinedBlocks.m */; }; 7E8F20F614F94C3100588C7D /* JFFBlockOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 65648BD413924220001E163C /* JFFBlockOperation.mm */; }; - 7E8F20F814F94C3100588C7D /* NSObject+AutoCancelAsyncOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 655ADDDF13B68E45005A6D3F /* NSObject+AutoCancelAsyncOperation.m */; }; 7E8F20FC14F94C3100588C7D /* JFFAsyncOperationContinuity.m in Sources */ = {isa = PBXBuildFile; fileRef = 651BE1661391928400DD6890 /* JFFAsyncOperationContinuity.m */; }; 7E8F20FE14F94C6100588C7D /* JFFObjectRelatedPropertyData.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D61CD2A13F2BC8A0003AC4A /* JFFObjectRelatedPropertyData.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E8F210014F94C6100588C7D /* NSObject+PropertyExtractor.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D61CD2F13F2BCE40003AC4A /* NSObject+PropertyExtractor.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E8F210214F94C6100588C7D /* JFFPropertyPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D9827F713F2B9D5009DD73B /* JFFPropertyPath.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E8F210414F94C6100588C7D /* JFFPropertyExtractor.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D9827FF13F2BA10009DD73B /* JFFPropertyExtractor.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E8F210614F94C6100588C7D /* NSObject+AsyncPropertyReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D9827F913F2B9D5009DD73B /* NSObject+AsyncPropertyReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7E8F210814F94C6100588C7D /* JFFCallbacksBlocksHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 65648BAD1392407F001E163C /* JFFCallbacksBlocksHolder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7E8F210A14F94C6100588C7D /* JFFCancelAsyncOperationBlockHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 65347F6B13B7EEE50002CF73 /* JFFCancelAsyncOperationBlockHolder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7E8F210A14F94C6100588C7D /* JFFAsyncOperationHandlerBlockHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 65347F6B13B7EEE50002CF73 /* JFFAsyncOperationHandlerBlockHolder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E8F210C14F94C6100588C7D /* JFFAsyncOperationProgressBlockHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 6534804A13B822F00002CF73 /* JFFAsyncOperationProgressBlockHolder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E8F210E14F94C6100588C7D /* JFFDidFinishAsyncOperationBlockHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D1B3D6D13B88A2700410ECB /* JFFDidFinishAsyncOperationBlockHolder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E8F211814F94C6100588C7D /* JFFAsyncOperationLoadBalancer.h in Headers */ = {isa = PBXBuildFile; fileRef = 65347F9413B7F0BD0002CF73 /* JFFAsyncOperationLoadBalancer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E8F211A14F94C6100588C7D /* JFFAsyncOperationsBlockDefinitions.h in Headers */ = {isa = PBXBuildFile; fileRef = 651BE1611391913300DD6890 /* JFFAsyncOperationsBlockDefinitions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E8F211B14F94C6100588C7D /* JFFAsyncOperationsPredefinedBlocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B835B31142CBA2200FC004C /* JFFAsyncOperationsPredefinedBlocks.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E8F211D14F94C6100588C7D /* JFFBlockOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 65648BD313924220001E163C /* JFFBlockOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7E8F211F14F94C6100588C7D /* NSObject+AutoCancelAsyncOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 655ADDDE13B68E45005A6D3F /* NSObject+AutoCancelAsyncOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E8F212114F94C6100588C7D /* JFFAsyncOperationUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 65648C381392490F001E163C /* JFFAsyncOperationUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E8F212314F94C6100588C7D /* JFFAsyncOperationContinuity.h in Headers */ = {isa = PBXBuildFile; fileRef = 651BE1651391928400DD6890 /* JFFAsyncOperationContinuity.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E8F212514F94C6100588C7D /* JFFAsyncOperations.h in Headers */ = {isa = PBXBuildFile; fileRef = 65648C5013924A77001E163C /* JFFAsyncOperations.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -178,12 +250,27 @@ 1B9368DF156504D800F8A394 /* JFFAsyncOperationInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFAsyncOperationInterface.h; sourceTree = ""; }; 1B9528FA1500E67900C9B979 /* NSError+ResultOwnerships.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+ResultOwnerships.h"; sourceTree = ""; }; 1B9528FB1500E67900C9B979 /* NSError+ResultOwnerships.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+ResultOwnerships.m"; sourceTree = ""; }; + 4C0C3EFE1826CC9200984027 /* JFFAsyncOperationState.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JFFAsyncOperationState.h; sourceTree = ""; }; + 4C0C3F001826D33B00984027 /* JFFAsyncOperationError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFAsyncOperationError.h; sourceTree = ""; }; + 4C0C3F011826D33B00984027 /* JFFAsyncOperationError.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFAsyncOperationError.m; sourceTree = ""; }; + 4C0C3F061826D39100984027 /* JFFAsyncOperationAbstractFinishError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFAsyncOperationAbstractFinishError.h; sourceTree = ""; }; + 4C0C3F071826D39100984027 /* JFFAsyncOperationAbstractFinishError.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFAsyncOperationAbstractFinishError.m; sourceTree = ""; }; + 4C0C3F0C1826D3ED00984027 /* JFFAsyncOpFinishedByUnsubscriptionError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFAsyncOpFinishedByUnsubscriptionError.h; sourceTree = ""; }; + 4C0C3F0D1826D3ED00984027 /* JFFAsyncOpFinishedByUnsubscriptionError.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFAsyncOpFinishedByUnsubscriptionError.m; sourceTree = ""; }; + 4C0C3F121826D60400984027 /* JFFAsyncOpFinishedByCancellationError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFAsyncOpFinishedByCancellationError.h; sourceTree = ""; }; + 4C0C3F131826D60400984027 /* JFFAsyncOpFinishedByCancellationError.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFAsyncOpFinishedByCancellationError.m; sourceTree = ""; }; + 4C1A0F8D182577BE0020FBF6 /* libJFFAsyncOperationsMacOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libJFFAsyncOperationsMacOS.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 4C1A0FEF1826A8E60020FBF6 /* JFFAsyncOperationHandlerTask.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JFFAsyncOperationHandlerTask.h; sourceTree = ""; }; + 4C5361F318608BD900EB89F5 /* NSObject+AutoCancelAsyncOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+AutoCancelAsyncOperation.h"; sourceTree = ""; }; + 4C5361F418608BD900EB89F5 /* NSObject+AutoCancelAsyncOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+AutoCancelAsyncOperation.m"; sourceTree = ""; }; 4C6DFB0C1718446500D86975 /* JFFBaseStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFBaseStrategy.h; sourceTree = ""; }; 4C6DFB0D1718446600D86975 /* JFFBaseStrategy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFBaseStrategy.m; sourceTree = ""; }; 4CB5CDE5174F54E100F2B600 /* NSArray+AsyncMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+AsyncMap.h"; sourceTree = ""; }; 4CB5CDE6174F54E100F2B600 /* NSArray+AsyncMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+AsyncMap.m"; sourceTree = ""; }; 4CB5CDE9174F551200F2B600 /* NSDictionary+AsyncMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+AsyncMap.h"; sourceTree = ""; }; 4CB5CDEA174F551300F2B600 /* NSDictionary+AsyncMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+AsyncMap.m"; sourceTree = ""; }; + 4CDB8E0E182BE4AD00C5BFA3 /* JFFFileDescriptorReaderError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFFileDescriptorReaderError.h; sourceTree = ""; }; + 4CDB8E0F182BE4AD00C5BFA3 /* JFFFileDescriptorReaderError.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFFileDescriptorReaderError.m; sourceTree = ""; }; 4CF62FAE16FDB6FE00DAE2BB /* JFFActiveLoaderData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFActiveLoaderData.h; sourceTree = ""; }; 4CF62FAF16FDB6FE00DAE2BB /* JFFActiveLoaderData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFActiveLoaderData.m; sourceTree = ""; }; 4CF62FB016FDB6FE00DAE2BB /* JFFAsyncOperationLoadBalancerContexts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFAsyncOperationLoadBalancerContexts.h; sourceTree = ""; }; @@ -198,16 +285,12 @@ 651BE1611391913300DD6890 /* JFFAsyncOperationsBlockDefinitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFAsyncOperationsBlockDefinitions.h; sourceTree = ""; }; 651BE1651391928400DD6890 /* JFFAsyncOperationContinuity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFAsyncOperationContinuity.h; sourceTree = ""; }; 651BE1661391928400DD6890 /* JFFAsyncOperationContinuity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFAsyncOperationContinuity.m; sourceTree = ""; }; - 65347F6B13B7EEE50002CF73 /* JFFCancelAsyncOperationBlockHolder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFCancelAsyncOperationBlockHolder.h; sourceTree = ""; }; - 65347F6C13B7EEE50002CF73 /* JFFCancelAsyncOperationBlockHolder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFCancelAsyncOperationBlockHolder.m; sourceTree = ""; }; + 65347F6B13B7EEE50002CF73 /* JFFAsyncOperationHandlerBlockHolder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFAsyncOperationHandlerBlockHolder.h; sourceTree = ""; }; + 65347F6C13B7EEE50002CF73 /* JFFAsyncOperationHandlerBlockHolder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFAsyncOperationHandlerBlockHolder.m; sourceTree = ""; }; 65347F9413B7F0BD0002CF73 /* JFFAsyncOperationLoadBalancer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFAsyncOperationLoadBalancer.h; sourceTree = ""; }; 65347F9513B7F0BD0002CF73 /* JFFAsyncOperationLoadBalancer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFAsyncOperationLoadBalancer.m; sourceTree = ""; }; 6534804A13B822F00002CF73 /* JFFAsyncOperationProgressBlockHolder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFAsyncOperationProgressBlockHolder.h; sourceTree = ""; }; 6534804B13B822F00002CF73 /* JFFAsyncOperationProgressBlockHolder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFAsyncOperationProgressBlockHolder.m; sourceTree = ""; }; - 655ADDDE13B68E45005A6D3F /* NSObject+AutoCancelAsyncOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+AutoCancelAsyncOperation.h"; sourceTree = ""; }; - 655ADDDF13B68E45005A6D3F /* NSObject+AutoCancelAsyncOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+AutoCancelAsyncOperation.m"; sourceTree = ""; }; - 65648BAD1392407F001E163C /* JFFCallbacksBlocksHolder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFCallbacksBlocksHolder.h; sourceTree = ""; }; - 65648BAE1392407F001E163C /* JFFCallbacksBlocksHolder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFCallbacksBlocksHolder.m; sourceTree = ""; }; 65648BD313924220001E163C /* JFFBlockOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFBlockOperation.h; sourceTree = ""; }; 65648BD413924220001E163C /* JFFBlockOperation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = JFFBlockOperation.mm; sourceTree = ""; }; 65648C381392490F001E163C /* JFFAsyncOperationUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFAsyncOperationUtils.h; sourceTree = ""; }; @@ -249,6 +332,14 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 4C1A0F88182577BE0020FBF6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4C1A0F89182577BE0020FBF6 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5391037514A88BB5007315A3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -282,6 +373,7 @@ D2AAC07E0554694100DB518D /* libJFFAsyncOperations.a */, 5391037B14A88BB5007315A3 /* libJFFAsyncOperations-clang.a */, 7E8F20C914F94BDF00588C7D /* JFFAsyncOperationsFW.framework */, + 4C1A0F8D182577BE0020FBF6 /* libJFFAsyncOperationsMacOS.a */, ); name = Products; sourceTree = ""; @@ -310,6 +402,7 @@ 08FB77AEFE84172EC02AAC07 /* Classes */ = { isa = PBXGroup; children = ( + 4C0C3EFF1826D31E00984027 /* Errors */, 4CB5CDE4174F54CA00F2B600 /* Categories */, 1B0D88BF1519F80C00EC4A92 /* AsyncOperartionsBuilder */, 8D9827F613F2B9AF009DD73B /* CachedAsyncOperations */, @@ -319,10 +412,10 @@ 651BE1611391913300DD6890 /* JFFAsyncOperationsBlockDefinitions.h */, 1B835B31142CBA2200FC004C /* JFFAsyncOperationsPredefinedBlocks.h */, 1B835B32142CBA2200FC004C /* JFFAsyncOperationsPredefinedBlocks.m */, + 4C0C3EFE1826CC9200984027 /* JFFAsyncOperationState.h */, + 4C1A0FEF1826A8E60020FBF6 /* JFFAsyncOperationHandlerTask.h */, 65648BD313924220001E163C /* JFFBlockOperation.h */, 65648BD413924220001E163C /* JFFBlockOperation.mm */, - 655ADDDE13B68E45005A6D3F /* NSObject+AutoCancelAsyncOperation.h */, - 655ADDDF13B68E45005A6D3F /* NSObject+AutoCancelAsyncOperation.m */, 65648C381392490F001E163C /* JFFAsyncOperationUtils.h */, 65648C391392490F001E163C /* JFFAsyncOperationUtils.mm */, 651BE1651391928400DD6890 /* JFFAsyncOperationContinuity.h */, @@ -359,6 +452,23 @@ name = "Other Sources"; sourceTree = ""; }; + 4C0C3EFF1826D31E00984027 /* Errors */ = { + isa = PBXGroup; + children = ( + 4C0C3F001826D33B00984027 /* JFFAsyncOperationError.h */, + 4C0C3F011826D33B00984027 /* JFFAsyncOperationError.m */, + 4C0C3F061826D39100984027 /* JFFAsyncOperationAbstractFinishError.h */, + 4C0C3F071826D39100984027 /* JFFAsyncOperationAbstractFinishError.m */, + 4C0C3F0C1826D3ED00984027 /* JFFAsyncOpFinishedByUnsubscriptionError.h */, + 4C0C3F0D1826D3ED00984027 /* JFFAsyncOpFinishedByUnsubscriptionError.m */, + 4C0C3F121826D60400984027 /* JFFAsyncOpFinishedByCancellationError.h */, + 4C0C3F131826D60400984027 /* JFFAsyncOpFinishedByCancellationError.m */, + 4CDB8E0E182BE4AD00C5BFA3 /* JFFFileDescriptorReaderError.h */, + 4CDB8E0F182BE4AD00C5BFA3 /* JFFFileDescriptorReaderError.m */, + ); + path = Errors; + sourceTree = ""; + }; 4CB5CDE4174F54CA00F2B600 /* Categories */ = { isa = PBXGroup; children = ( @@ -366,6 +476,8 @@ 4CB5CDE6174F54E100F2B600 /* NSArray+AsyncMap.m */, 4CB5CDE9174F551200F2B600 /* NSDictionary+AsyncMap.h */, 4CB5CDEA174F551300F2B600 /* NSDictionary+AsyncMap.m */, + 4C5361F318608BD900EB89F5 /* NSObject+AutoCancelAsyncOperation.h */, + 4C5361F418608BD900EB89F5 /* NSObject+AutoCancelAsyncOperation.m */, ); path = Categories; sourceTree = ""; @@ -390,8 +502,8 @@ 65347F2E13B7ECDB0002CF73 /* Helpers */ = { isa = PBXGroup; children = ( - 65347F6B13B7EEE50002CF73 /* JFFCancelAsyncOperationBlockHolder.h */, - 65347F6C13B7EEE50002CF73 /* JFFCancelAsyncOperationBlockHolder.m */, + 65347F6B13B7EEE50002CF73 /* JFFAsyncOperationHandlerBlockHolder.h */, + 65347F6C13B7EEE50002CF73 /* JFFAsyncOperationHandlerBlockHolder.m */, 6534804A13B822F00002CF73 /* JFFAsyncOperationProgressBlockHolder.h */, 6534804B13B822F00002CF73 /* JFFAsyncOperationProgressBlockHolder.m */, 8D1B3D6D13B88A2700410ECB /* JFFDidFinishAsyncOperationBlockHolder.h */, @@ -417,8 +529,6 @@ 65648AF913923C47001E163C /* Detail */ = { isa = PBXGroup; children = ( - 65648BAD1392407F001E163C /* JFFCallbacksBlocksHolder.h */, - 65648BAE1392407F001E163C /* JFFCallbacksBlocksHolder.m */, 1B9528FA1500E67900C9B979 /* NSError+ResultOwnerships.h */, 1B9528FB1500E67900C9B979 /* NSError+ResultOwnerships.m */, 1B0E83A71563954B00825E3C /* JFFAsyncOperationAdapter.h */, @@ -493,6 +603,48 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + 4C1A0F45182577BE0020FBF6 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 4C1A0F46182577BE0020FBF6 /* JFFAsyncOperations_Prefix.pch in Headers */, + 4C1A0F47182577BE0020FBF6 /* JFFAsyncOperationsBlockDefinitions.h in Headers */, + 4C1A0F48182577BE0020FBF6 /* JFFAsyncOperationContinuity.h in Headers */, + 4C0C3F091826D39100984027 /* JFFAsyncOperationAbstractFinishError.h in Headers */, + 4C1A0F4A182577BE0020FBF6 /* JFFBlockOperation.h in Headers */, + 4C1A0F4B182577BE0020FBF6 /* JFFAsyncOperationUtils.h in Headers */, + 4C1A0F4C182577BE0020FBF6 /* JFFAsyncOperations.h in Headers */, + 4C0C3F151826D60400984027 /* JFFAsyncOpFinishedByCancellationError.h in Headers */, + 4C1A0F4E182577BE0020FBF6 /* JFFAsyncOperationHandlerBlockHolder.h in Headers */, + 4C1A0F4F182577BE0020FBF6 /* JFFAsyncOperationLoadBalancer.h in Headers */, + 4C1A0F50182577BE0020FBF6 /* JFFAsyncOperationProgressBlockHolder.h in Headers */, + 4C1A0F51182577BE0020FBF6 /* JFFDidFinishAsyncOperationBlockHolder.h in Headers */, + 4C1A0F52182577BE0020FBF6 /* JFFPropertyPath.h in Headers */, + 4C1A0F53182577BE0020FBF6 /* NSObject+AsyncPropertyReader.h in Headers */, + 4C1A0F54182577BE0020FBF6 /* JFFPropertyExtractor.h in Headers */, + 4C1A0F55182577BE0020FBF6 /* JFFObjectRelatedPropertyData.h in Headers */, + 4C1A0F56182577BE0020FBF6 /* NSObject+PropertyExtractor.h in Headers */, + 4C1A0F57182577BE0020FBF6 /* JFFAsyncOperationsPredefinedBlocks.h in Headers */, + 4C1A0F58182577BE0020FBF6 /* NSError+ResultOwnerships.h in Headers */, + 4C1A0F59182577BE0020FBF6 /* JFFAsyncOperationHelpers.h in Headers */, + 4C1A0F5A182577BE0020FBF6 /* JFFAsyncOperationBuilder.h in Headers */, + 4C1A0F5B182577BE0020FBF6 /* JFFAsyncOperationAdapter.h in Headers */, + 4C1A0F5C182577BE0020FBF6 /* JFFLimitedLoadersQueue.h in Headers */, + 4C1A0F5D182577BE0020FBF6 /* JFFStrategyFifo.h in Headers */, + 4C1A0F5E182577BE0020FBF6 /* JFFQueueState.h in Headers */, + 4CDB8E11182BE4AD00C5BFA3 /* JFFFileDescriptorReaderError.h in Headers */, + 4C0C3F0F1826D3ED00984027 /* JFFAsyncOpFinishedByUnsubscriptionError.h in Headers */, + 4C1A0F5F182577BE0020FBF6 /* JFFQueueStrategyFactory.h in Headers */, + 4C1A0F60182577BE0020FBF6 /* JFFStrategyStack.h in Headers */, + 4C1A0F61182577BE0020FBF6 /* JFFStrategyRandom.h in Headers */, + 4C1A0F62182577BE0020FBF6 /* JFFAsyncOperationLoadBalancerContexts.h in Headers */, + 4C1A0F63182577BE0020FBF6 /* JFFBaseStrategy.h in Headers */, + 4C0C3F031826D33B00984027 /* JFFAsyncOperationError.h in Headers */, + 4C1A0F64182577BE0020FBF6 /* NSArray+AsyncMap.h in Headers */, + 4C1A0F65182577BE0020FBF6 /* NSDictionary+AsyncMap.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5391035614A88BB5007315A3 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -500,12 +652,10 @@ 5391035714A88BB5007315A3 /* JFFAsyncOperations_Prefix.pch in Headers */, 5391035814A88BB5007315A3 /* JFFAsyncOperationsBlockDefinitions.h in Headers */, 5391035914A88BB5007315A3 /* JFFAsyncOperationContinuity.h in Headers */, - 5391035A14A88BB5007315A3 /* JFFCallbacksBlocksHolder.h in Headers */, 5391035C14A88BB5007315A3 /* JFFBlockOperation.h in Headers */, 5391035D14A88BB5007315A3 /* JFFAsyncOperationUtils.h in Headers */, 5391035E14A88BB5007315A3 /* JFFAsyncOperations.h in Headers */, - 5391035F14A88BB5007315A3 /* NSObject+AutoCancelAsyncOperation.h in Headers */, - 5391036014A88BB5007315A3 /* JFFCancelAsyncOperationBlockHolder.h in Headers */, + 5391036014A88BB5007315A3 /* JFFAsyncOperationHandlerBlockHolder.h in Headers */, 5391036114A88BB5007315A3 /* JFFAsyncOperationLoadBalancer.h in Headers */, 5391036514A88BB5007315A3 /* JFFAsyncOperationProgressBlockHolder.h in Headers */, 5391036714A88BB5007315A3 /* JFFDidFinishAsyncOperationBlockHolder.h in Headers */, @@ -533,15 +683,13 @@ 7E8F210214F94C6100588C7D /* JFFPropertyPath.h in Headers */, 7E8F210414F94C6100588C7D /* JFFPropertyExtractor.h in Headers */, 7E8F210614F94C6100588C7D /* NSObject+AsyncPropertyReader.h in Headers */, - 7E8F210814F94C6100588C7D /* JFFCallbacksBlocksHolder.h in Headers */, - 7E8F210A14F94C6100588C7D /* JFFCancelAsyncOperationBlockHolder.h in Headers */, + 7E8F210A14F94C6100588C7D /* JFFAsyncOperationHandlerBlockHolder.h in Headers */, 7E8F210C14F94C6100588C7D /* JFFAsyncOperationProgressBlockHolder.h in Headers */, 7E8F210E14F94C6100588C7D /* JFFDidFinishAsyncOperationBlockHolder.h in Headers */, 7E8F211814F94C6100588C7D /* JFFAsyncOperationLoadBalancer.h in Headers */, 7E8F211A14F94C6100588C7D /* JFFAsyncOperationsBlockDefinitions.h in Headers */, 7E8F211B14F94C6100588C7D /* JFFAsyncOperationsPredefinedBlocks.h in Headers */, 7E8F211D14F94C6100588C7D /* JFFBlockOperation.h in Headers */, - 7E8F211F14F94C6100588C7D /* NSObject+AutoCancelAsyncOperation.h in Headers */, 7E8F212114F94C6100588C7D /* JFFAsyncOperationUtils.h in Headers */, 7E8F212314F94C6100588C7D /* JFFAsyncOperationContinuity.h in Headers */, 7E8F212514F94C6100588C7D /* JFFAsyncOperations.h in Headers */, @@ -561,12 +709,13 @@ AA747D9F0F9514B9006C5449 /* JFFAsyncOperations_Prefix.pch in Headers */, 651BE1621391913300DD6890 /* JFFAsyncOperationsBlockDefinitions.h in Headers */, 651BE1671391928400DD6890 /* JFFAsyncOperationContinuity.h in Headers */, - 65648BAF1392407F001E163C /* JFFCallbacksBlocksHolder.h in Headers */, + 4C0C3F081826D39100984027 /* JFFAsyncOperationAbstractFinishError.h in Headers */, + 4C5361F518608BD900EB89F5 /* NSObject+AutoCancelAsyncOperation.h in Headers */, 65648BD513924220001E163C /* JFFBlockOperation.h in Headers */, 65648C3A1392490F001E163C /* JFFAsyncOperationUtils.h in Headers */, 65648C5113924A77001E163C /* JFFAsyncOperations.h in Headers */, - 655ADDE013B68E45005A6D3F /* NSObject+AutoCancelAsyncOperation.h in Headers */, - 65347F6D13B7EEE50002CF73 /* JFFCancelAsyncOperationBlockHolder.h in Headers */, + 4C0C3F141826D60400984027 /* JFFAsyncOpFinishedByCancellationError.h in Headers */, + 65347F6D13B7EEE50002CF73 /* JFFAsyncOperationHandlerBlockHolder.h in Headers */, 65347F9613B7F0BD0002CF73 /* JFFAsyncOperationLoadBalancer.h in Headers */, 6534804C13B822F00002CF73 /* JFFAsyncOperationProgressBlockHolder.h in Headers */, 8D1B3D6F13B88A2700410ECB /* JFFDidFinishAsyncOperationBlockHolder.h in Headers */, @@ -583,11 +732,14 @@ CE4031CC163D266B00FE6427 /* JFFLimitedLoadersQueue.h in Headers */, 7E79064D16E4981700CFC696 /* JFFStrategyFifo.h in Headers */, 7E79065516E4984400CFC696 /* JFFQueueState.h in Headers */, + 4CDB8E10182BE4AD00C5BFA3 /* JFFFileDescriptorReaderError.h in Headers */, + 4C0C3F0E1826D3ED00984027 /* JFFAsyncOpFinishedByUnsubscriptionError.h in Headers */, 7E79065D16E49DD900CFC696 /* JFFQueueStrategyFactory.h in Headers */, 7E79066516E49F8000CFC696 /* JFFStrategyStack.h in Headers */, 7E79066D16E4A49B00CFC696 /* JFFStrategyRandom.h in Headers */, 4CBBDCC0171741DB004D670D /* JFFAsyncOperationLoadBalancerContexts.h in Headers */, 4C6DFB0E1718446600D86975 /* JFFBaseStrategy.h in Headers */, + 4C0C3F021826D33B00984027 /* JFFAsyncOperationError.h in Headers */, 4CB5CDE7174F54E200F2B600 /* NSArray+AsyncMap.h in Headers */, 4CB5CDEB174F551300F2B600 /* NSDictionary+AsyncMap.h in Headers */, ); @@ -596,6 +748,23 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 4C1A0F44182577BE0020FBF6 /* JFFAsyncOperationsMacOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4C1A0F8A182577BE0020FBF6 /* Build configuration list for PBXNativeTarget "JFFAsyncOperationsMacOS" */; + buildPhases = ( + 4C1A0F45182577BE0020FBF6 /* Headers */, + 4C1A0F66182577BE0020FBF6 /* Sources */, + 4C1A0F88182577BE0020FBF6 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = JFFAsyncOperationsMacOS; + productName = JFFAsyncOperations; + productReference = 4C1A0F8D182577BE0020FBF6 /* libJFFAsyncOperationsMacOS.a */; + productType = "com.apple.product-type.library.static"; + }; 5391035314A88BB5007315A3 /* JFFAsyncOperations-clang */ = { isa = PBXNativeTarget; buildConfigurationList = 5391037814A88BB5007315A3 /* Build configuration list for PBXNativeTarget "JFFAsyncOperations-clang" */; @@ -657,7 +826,7 @@ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0510; }; buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "JFFAsyncOperations" */; compatibilityVersion = "Xcode 3.2"; @@ -678,6 +847,7 @@ D2AAC07D0554694100DB518D /* JFFAsyncOperations */, 5391035314A88BB5007315A3 /* JFFAsyncOperations-clang */, 7E8F20C814F94BDF00588C7D /* JFFAsyncOperationsFW */, + 4C1A0F44182577BE0020FBF6 /* JFFAsyncOperationsMacOS */, ); }; /* End PBXProject section */ @@ -739,16 +909,57 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 4C1A0F66182577BE0020FBF6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4C1A0F68182577BE0020FBF6 /* JFFDidFinishAsyncOperationBlockHolder.m in Sources */, + 4C1A0F69182577BE0020FBF6 /* JFFAsyncOperationHandlerBlockHolder.m in Sources */, + 4C1A0F6A182577BE0020FBF6 /* JFFAsyncOperationProgressBlockHolder.m in Sources */, + 4C1A0F6B182577BE0020FBF6 /* JFFAsyncOperationContinuity.m in Sources */, + 4C1A0F6D182577BE0020FBF6 /* NSObject+AsyncPropertyReader.m in Sources */, + 4C1A0F6E182577BE0020FBF6 /* JFFPropertyExtractor.m in Sources */, + 4C1A0F6F182577BE0020FBF6 /* JFFPropertyPath.m in Sources */, + 4C1A0F70182577BE0020FBF6 /* JFFObjectRelatedPropertyData.m in Sources */, + 4C1A0F71182577BE0020FBF6 /* NSObject+PropertyExtractor.m in Sources */, + 4C1A0F72182577BE0020FBF6 /* JFFAsyncOperationsPredefinedBlocks.m in Sources */, + 4C1A0F73182577BE0020FBF6 /* JFFBlockOperation.mm in Sources */, + 4C1A0F74182577BE0020FBF6 /* NSError+ResultOwnerships.m in Sources */, + 4C1A0F75182577BE0020FBF6 /* JFFAsyncOperationHelpers.m in Sources */, + 4C1A0F76182577BE0020FBF6 /* JFFAsyncOperationBuilder.m in Sources */, + 4C1A0F77182577BE0020FBF6 /* JFFAsyncOperationUtils.mm in Sources */, + 4C1A0F78182577BE0020FBF6 /* JFFAsyncOperationAdapter.mm in Sources */, + 4CDB8E13182BE4AD00C5BFA3 /* JFFFileDescriptorReaderError.m in Sources */, + 4C1A0F79182577BE0020FBF6 /* JFFLimitedLoadersQueue.m in Sources */, + 4C0C3F111826D3ED00984027 /* JFFAsyncOpFinishedByUnsubscriptionError.m in Sources */, + 4C1A0F7A182577BE0020FBF6 /* JFFStrategyFifo.m in Sources */, + 4C0C3F0B1826D39100984027 /* JFFAsyncOperationAbstractFinishError.m in Sources */, + 4C0C3F171826D60400984027 /* JFFAsyncOpFinishedByCancellationError.m in Sources */, + 4C1A0F7B182577BE0020FBF6 /* JFFQueueState.m in Sources */, + 4C1A0F7C182577BE0020FBF6 /* JFFQueueStrategyFactory.m in Sources */, + 4C1A0F7D182577BE0020FBF6 /* JFFStrategyStack.m in Sources */, + 4C1A0F7E182577BE0020FBF6 /* JFFStrategyRandom.mm in Sources */, + 4C1A0F7F182577BE0020FBF6 /* JFFBaseLoaderOwner.m in Sources */, + 4C1A0F80182577BE0020FBF6 /* JFFAsyncOperationLoadBalancer.m in Sources */, + 4C1A0F81182577BE0020FBF6 /* JFFActiveLoaderData.m in Sources */, + 4C1A0F82182577BE0020FBF6 /* JFFAsyncOperationLoadBalancerContexts.m in Sources */, + 4C1A0F83182577BE0020FBF6 /* JFFContextLoaders.m in Sources */, + 4C1A0F84182577BE0020FBF6 /* JFFPedingLoaderData.m in Sources */, + 4C1A0F85182577BE0020FBF6 /* JFFBaseStrategy.m in Sources */, + 4C1A0F86182577BE0020FBF6 /* NSArray+AsyncMap.m in Sources */, + 4C0C3F051826D33B00984027 /* JFFAsyncOperationError.m in Sources */, + 4C1A0F87182577BE0020FBF6 /* NSDictionary+AsyncMap.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5391036E14A88BB5007315A3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5391036F14A88BB5007315A3 /* NSObject+AutoCancelAsyncOperation.m in Sources */, 5391037014A88BB5007315A3 /* JFFDidFinishAsyncOperationBlockHolder.m in Sources */, - 5391037114A88BB5007315A3 /* JFFCancelAsyncOperationBlockHolder.m in Sources */, + 5391037114A88BB5007315A3 /* JFFAsyncOperationHandlerBlockHolder.m in Sources */, 5391037214A88BB5007315A3 /* JFFAsyncOperationProgressBlockHolder.m in Sources */, 5391037314A88BB5007315A3 /* JFFAsyncOperationContinuity.m in Sources */, - 5391037414A88BB5007315A3 /* JFFCallbacksBlocksHolder.m in Sources */, 4CF62FCD16FDBA3800DAE2BB /* JFFAsyncOperationLoadBalancer.m in Sources */, 7E79065116E4981700CFC696 /* JFFStrategyFifo.m in Sources */, 7E79065916E4984400CFC696 /* JFFQueueState.m in Sources */, @@ -771,13 +982,11 @@ 7E8F20DB14F94C3100588C7D /* JFFPropertyPath.m in Sources */, 7E8F20DD14F94C3100588C7D /* JFFPropertyExtractor.m in Sources */, 7E8F20DF14F94C3100588C7D /* NSObject+AsyncPropertyReader.m in Sources */, - 7E8F20E114F94C3100588C7D /* JFFCallbacksBlocksHolder.m in Sources */, - 7E8F20E314F94C3100588C7D /* JFFCancelAsyncOperationBlockHolder.m in Sources */, + 7E8F20E314F94C3100588C7D /* JFFAsyncOperationHandlerBlockHolder.m in Sources */, 7E8F20E514F94C3100588C7D /* JFFAsyncOperationProgressBlockHolder.m in Sources */, 7E8F20E714F94C3100588C7D /* JFFDidFinishAsyncOperationBlockHolder.m in Sources */, 7E8F20F414F94C3100588C7D /* JFFAsyncOperationsPredefinedBlocks.m in Sources */, 7E8F20F614F94C3100588C7D /* JFFBlockOperation.mm in Sources */, - 7E8F20F814F94C3100588C7D /* NSObject+AutoCancelAsyncOperation.m in Sources */, 7E8F20FC14F94C3100588C7D /* JFFAsyncOperationContinuity.m in Sources */, 4CF62FCE16FDBA3800DAE2BB /* JFFAsyncOperationLoadBalancer.m in Sources */, 7E79065216E4981700CFC696 /* JFFStrategyFifo.m in Sources */, @@ -798,13 +1007,12 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1B2A678D143F3D0E00BC284F /* NSObject+AutoCancelAsyncOperation.m in Sources */, 1B2A67E5143F4CAB00BC284F /* JFFDidFinishAsyncOperationBlockHolder.m in Sources */, - 1B2A682B143F532500BC284F /* JFFCancelAsyncOperationBlockHolder.m in Sources */, + 1B2A682B143F532500BC284F /* JFFAsyncOperationHandlerBlockHolder.m in Sources */, 1B2A682E143F537B00BC284F /* JFFAsyncOperationProgressBlockHolder.m in Sources */, 1BA2551C1443109B00C9B2BE /* JFFAsyncOperationContinuity.m in Sources */, - 1B0857D3145169B3001DDE0A /* JFFCallbacksBlocksHolder.m in Sources */, 6572C43814A75CD8008CFCFD /* NSObject+AsyncPropertyReader.m in Sources */, + 4C5361F618608BD900EB89F5 /* NSObject+AutoCancelAsyncOperation.m in Sources */, 6572C43914A75CDA008CFCFD /* JFFPropertyExtractor.m in Sources */, 6572C43A14A75CDC008CFCFD /* JFFPropertyPath.m in Sources */, 6572C43B14A75CE1008CFCFD /* JFFObjectRelatedPropertyData.m in Sources */, @@ -816,8 +1024,12 @@ 1B0D88C41519F81F00EC4A92 /* JFFAsyncOperationBuilder.m in Sources */, 1B0E83A51563953300825E3C /* JFFAsyncOperationUtils.mm in Sources */, 1B0E83AA1563954B00825E3C /* JFFAsyncOperationAdapter.mm in Sources */, + 4CDB8E12182BE4AD00C5BFA3 /* JFFFileDescriptorReaderError.m in Sources */, CE4031CD163D266B00FE6427 /* JFFLimitedLoadersQueue.m in Sources */, + 4C0C3F101826D3ED00984027 /* JFFAsyncOpFinishedByUnsubscriptionError.m in Sources */, 7E79065016E4981700CFC696 /* JFFStrategyFifo.m in Sources */, + 4C0C3F0A1826D39100984027 /* JFFAsyncOperationAbstractFinishError.m in Sources */, + 4C0C3F161826D60400984027 /* JFFAsyncOpFinishedByCancellationError.m in Sources */, 7E79065816E4984400CFC696 /* JFFQueueState.m in Sources */, 7E79066016E49DD900CFC696 /* JFFQueueStrategyFactory.m in Sources */, 7E79066816E49F8000CFC696 /* JFFStrategyStack.m in Sources */, @@ -830,6 +1042,7 @@ 4CBBDCCE1717422D004D670D /* JFFPedingLoaderData.m in Sources */, 4C6DFB0F1718446600D86975 /* JFFBaseStrategy.m in Sources */, 4CB5CDE8174F54E200F2B600 /* NSArray+AsyncMap.m in Sources */, + 4C0C3F041826D33B00984027 /* JFFAsyncOperationError.m in Sources */, 4CB5CDEC174F551300F2B600 /* NSDictionary+AsyncMap.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -860,7 +1073,6 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = JFFAsyncOperations_Prefix.pch; INSTALL_PATH = /usr/local/lib; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = JFFAsyncOperations; SKIP_INSTALL = YES; }; @@ -875,7 +1087,6 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = JFFAsyncOperations_Prefix.pch; INSTALL_PATH = /usr/local/lib; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = JFFAsyncOperations; SKIP_INSTALL = YES; }; @@ -886,6 +1097,7 @@ buildSettings = { CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; GCC_OPTIMIZATION_LEVEL = 0; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; @@ -893,8 +1105,9 @@ GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ../; - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; + ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; }; @@ -905,24 +1118,59 @@ buildSettings = { CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ../; - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; }; name = Release; }; + 4C1A0F8B182577BE0020FBF6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + COPY_PHASE_STRIP = NO; + DSTROOT = /tmp/JFFAsyncOperations.dst; + GCC_DYNAMIC_NO_PIC = NO; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = JFFAsyncOperations_Prefix.pch; + INSTALL_PATH = /usr/local/lib; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + PRODUCT_NAME = JFFAsyncOperationsMacOS; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 4C1A0F8C182577BE0020FBF6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + DSTROOT = /tmp/JFFAsyncOperations.dst; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = JFFAsyncOperations_Prefix.pch; + INSTALL_PATH = /usr/local/lib; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + PRODUCT_NAME = JFFAsyncOperationsMacOS; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Release; + }; 5391037914A88BB5007315A3 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; COPY_PHASE_STRIP = NO; DSTROOT = /tmp/JFFAsyncOperations.dst; GCC_DYNAMIC_NO_PIC = NO; @@ -941,7 +1189,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; DSTROOT = /tmp/JFFAsyncOperations.dst; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -1021,6 +1268,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 4C1A0F8A182577BE0020FBF6 /* Build configuration list for PBXNativeTarget "JFFAsyncOperationsMacOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4C1A0F8B182577BE0020FBF6 /* Debug */, + 4C1A0F8C182577BE0020FBF6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 5391037814A88BB5007315A3 /* Build configuration list for PBXNativeTarget "JFFAsyncOperations-clang" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/lib/JFFAsyncOperations/JFFAsyncOperationsBlockDefinitions.h b/lib/JFFAsyncOperations/JFFAsyncOperationsBlockDefinitions.h index c67629d..2178116 100644 --- a/lib/JFFAsyncOperations/JFFAsyncOperationsBlockDefinitions.h +++ b/lib/JFFAsyncOperations/JFFAsyncOperationsBlockDefinitions.h @@ -2,30 +2,32 @@ #define __JASYNC__BLOCK_DEFINITIONS_H__ #import +#include +#include @class NSError; -typedef void (^JFFAsyncOperationProgressHandler)(id progressInfo); +typedef void (^JFFAsyncOperationProgressCallback)(id progressInfo); //Synchronous block which can take a lot of time typedef id (^JFFSyncOperation)(NSError *__autoreleasing *outError); //This block should call progress_callback_ block only from own thread typedef id (^JFFSyncOperationWithProgress)(NSError *__autoreleasing *error, - JFFAsyncOperationProgressHandler progressCallback); + JFFAsyncOperationProgressCallback progressCallback); -typedef void (^JFFDidFinishAsyncOperationHandler)(id result, NSError *error); +typedef void (^JFFDidFinishAsyncOperationCallback)(id result, NSError *error); -typedef void (^JFFCancelAsyncOperation)(BOOL unsubscribeOnlyIfNo); +typedef void (^JFFAsyncOperationHandler)(JFFAsyncOperationHandlerTask task); -typedef JFFCancelAsyncOperation JFFCancelAsyncOperationHandler; +typedef void (^JFFAsyncOperationChangeStateCallback)(JFFAsyncOperationState state); //@@ progressCallback -- nil | valid block -//@@ cancelCallback -- nil | valid block +//@@ stateCallback -- nil | valid block //@@ doneCallback -- nil | valid block -typedef JFFCancelAsyncOperation (^JFFAsyncOperation)(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback); +typedef JFFAsyncOperationHandler (^JFFAsyncOperation)(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback); //@@ next binder receives the result of the previous operation //@@ next binder may receive an error if previous operation fails and the binder gets called @@ -33,7 +35,7 @@ typedef JFFAsyncOperation (^JFFAsyncOperationBinder)(id result); typedef void (^JFFDidFinishAsyncOperationHook)(id result, NSError *error, - JFFDidFinishAsyncOperationHandler doneCallback); + JFFDidFinishAsyncOperationCallback doneCallback); typedef JFFAsyncOperation (^JFFContinueLoaderWithResult)(id result, NSError *error); diff --git a/lib/JFFAsyncOperations/JFFAsyncOperationsPredefinedBlocks.h b/lib/JFFAsyncOperations/JFFAsyncOperationsPredefinedBlocks.h index 8a14750..16980db 100755 --- a/lib/JFFAsyncOperations/JFFAsyncOperationsPredefinedBlocks.h +++ b/lib/JFFAsyncOperations/JFFAsyncOperationsPredefinedBlocks.h @@ -2,4 +2,4 @@ #import -extern JFFCancelAsyncOperation JFFStubCancelAsyncOperationBlock; +extern JFFAsyncOperationHandler JFFStubHandlerAsyncOperationBlock; diff --git a/lib/JFFAsyncOperations/JFFAsyncOperationsPredefinedBlocks.m b/lib/JFFAsyncOperations/JFFAsyncOperationsPredefinedBlocks.m index c969922..8480494 100755 --- a/lib/JFFAsyncOperations/JFFAsyncOperationsPredefinedBlocks.m +++ b/lib/JFFAsyncOperations/JFFAsyncOperationsPredefinedBlocks.m @@ -1,3 +1,3 @@ #import "JFFAsyncOperationsPredefinedBlocks.h" -JFFCancelAsyncOperation JFFStubCancelAsyncOperationBlock = ^void(BOOL cancel){ /*do nothing*/ }; +JFFAsyncOperationHandler JFFStubHandlerAsyncOperationBlock = ^void(JFFAsyncOperationHandlerTask task){ /*do nothing*/ }; diff --git a/lib/JFFAsyncOperations/JFFBlockOperation.h b/lib/JFFAsyncOperations/JFFBlockOperation.h index aae400f..7b8fed7 100644 --- a/lib/JFFAsyncOperations/JFFBlockOperation.h +++ b/lib/JFFAsyncOperations/JFFBlockOperation.h @@ -6,15 +6,15 @@ + (instancetype)performOperationWithQueueName:(const char*)queueName loadDataBlock:(JFFSyncOperationWithProgress)loadDataBlock - didLoadDataBlock:(JFFDidFinishAsyncOperationHandler)didLoadDataBlock - progressBlock:(JFFAsyncOperationProgressHandler)progressBlock + didLoadDataBlock:(JFFDidFinishAsyncOperationCallback)didLoadDataBlock + progressBlock:(JFFAsyncOperationProgressCallback)progressBlock barrier:(BOOL)barrier currentQueue:(dispatch_queue_t)currentQueue serialOrConcurrent:(dispatch_queue_attr_t)serialOrConcurrent; + (instancetype)performOperationWithQueueName:(const char*)queueName loadDataBlock:(JFFSyncOperationWithProgress)loadDataBlock - didLoadDataBlock:(JFFDidFinishAsyncOperationHandler)didLoadDataBlock; + didLoadDataBlock:(JFFDidFinishAsyncOperationCallback)didLoadDataBlock; - (void)cancel; diff --git a/lib/JFFAsyncOperations/JFFBlockOperation.mm b/lib/JFFAsyncOperations/JFFBlockOperation.mm index ca38e21..d578b55 100644 --- a/lib/JFFAsyncOperations/JFFBlockOperation.mm +++ b/lib/JFFAsyncOperations/JFFBlockOperation.mm @@ -4,9 +4,9 @@ @interface JFFBlockOperation () -@property (nonatomic, copy) JFFSyncOperationWithProgress loadDataBlock; -@property (nonatomic, copy) JFFDidFinishAsyncOperationHandler didLoadDataBlock; -@property (nonatomic, copy) JFFAsyncOperationProgressHandler progressBlock; +@property (nonatomic, copy) JFFSyncOperationWithProgress loadDataBlock; +@property (nonatomic, copy) JFFDidFinishAsyncOperationCallback didLoadDataBlock; +@property (nonatomic, copy) JFFAsyncOperationProgressCallback progressBlock; @property BOOL finishedOrCanceled; @end @@ -25,8 +25,8 @@ - (void)dealloc } - (instancetype)initWithLoadDataBlock:(JFFSyncOperationWithProgress)loadDataBlock - didLoadDataBlock:(JFFDidFinishAsyncOperationHandler)didLoadDataBlock - progressBlock:(JFFAsyncOperationProgressHandler)progressBlock + didLoadDataBlock:(JFFDidFinishAsyncOperationCallback)didLoadDataBlock + progressBlock:(JFFAsyncOperationProgressCallback)progressBlock currentQueue:(dispatch_queue_t)currentQueue barrier:(BOOL)barrier serialOrConcurrent:(dispatch_queue_attr_t)serialOrConcurrent @@ -93,7 +93,7 @@ - (void)performBackgroundOperationInQueue:(dispatch_queue_t)queue NSError *error; id opResult; @try { - JFFAsyncOperationProgressHandler progressCallback = ^(id info) { + JFFAsyncOperationProgressCallback progressCallback = ^(id info) { //TODO to garante that finish will called after progress dispatch_async(_currentQueue, ^ { [self progressWithInfo:info]; @@ -122,8 +122,8 @@ - (void)performBackgroundOperationInQueue:(dispatch_queue_t)queue + (instancetype)performOperationWithQueueName:(const char*)queueName loadDataBlock:(JFFSyncOperationWithProgress)loadDataBlock - didLoadDataBlock:(JFFDidFinishAsyncOperationHandler)didLoadDataBlock - progressBlock:(JFFAsyncOperationProgressHandler)progressBlock + didLoadDataBlock:(JFFDidFinishAsyncOperationCallback)didLoadDataBlock + progressBlock:(JFFAsyncOperationProgressCallback)progressBlock barrier:(BOOL)barrier currentQueue:(dispatch_queue_t)currentQueue serialOrConcurrent:(dispatch_queue_attr_t)serialOrConcurrent @@ -156,7 +156,7 @@ + (instancetype)performOperationWithQueueName:(const char*)queueName + (instancetype)performOperationWithQueueName:(const char *)queueName loadDataBlock:(JFFSyncOperationWithProgress)loadDataBlock - didLoadDataBlock:(JFFDidFinishAsyncOperationHandler)didLoadDataBlock + didLoadDataBlock:(JFFDidFinishAsyncOperationCallback)didLoadDataBlock { NSParameterAssert([NSThread isMainThread]); return [self performOperationWithQueueName:queueName diff --git a/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFActiveLoaderData.h b/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFActiveLoaderData.h index d1e4a7e..521313f 100755 --- a/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFActiveLoaderData.h +++ b/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFActiveLoaderData.h @@ -5,6 +5,6 @@ @interface JFFActiveLoaderData : NSObject @property (nonatomic, copy) JFFAsyncOperation nativeLoader; -@property (nonatomic, copy) JFFCancelAsyncOperation wrappedCancel; +@property (nonatomic, copy) JFFAsyncOperationHandler wrappedHandler; @end diff --git a/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFBaseLoaderOwner.h b/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFBaseLoaderOwner.h index 1067bdc..ff3ae0c 100644 --- a/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFBaseLoaderOwner.h +++ b/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFBaseLoaderOwner.h @@ -11,10 +11,10 @@ @property (nonatomic, copy) JFFAsyncOperation loader; @property (nonatomic, weak) JFFLimitedLoadersQueue *queue; -@property (nonatomic, copy) JFFCancelAsyncOperation cancelLoader; -@property (nonatomic, copy) JFFAsyncOperationProgressHandler progressCallback; -@property (nonatomic, copy) JFFCancelAsyncOperationHandler cancelCallback; -@property (nonatomic, copy) JFFDidFinishAsyncOperationHandler doneCallback; +@property (nonatomic, copy) JFFAsyncOperationHandler loadersHandler; +@property (nonatomic, copy) JFFAsyncOperationProgressCallback progressCallback; +@property (nonatomic, copy) JFFAsyncOperationChangeStateCallback stateCallback; +@property (nonatomic, copy) JFFDidFinishAsyncOperationCallback doneCallback; + (instancetype)newLoaderOwnerWithLoader:(JFFAsyncOperation)loader queue:(JFFLimitedLoadersQueue *)queue; diff --git a/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFBaseLoaderOwner.m b/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFBaseLoaderOwner.m index df8be16..4c6fa6a 100644 --- a/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFBaseLoaderOwner.m +++ b/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFBaseLoaderOwner.m @@ -28,38 +28,29 @@ - (void)clear { _loader = nil; _queue = nil; - _cancelLoader = nil; + _loadersHandler = nil; _progressCallback = nil; - _cancelCallback = nil; + _stateCallback = nil; _doneCallback = nil; } - (void)performLoader { - NSParameterAssert(_cancelLoader == nil); + NSParameterAssert(_loadersHandler == nil); - JFFAsyncOperationProgressHandler progressCallback = ^(id progress) { + JFFAsyncOperationProgressCallback progressCallback = ^(id progress) { if (_progressCallback) _progressCallback(progress); }; - JFFCancelAsyncOperationHandler cancelCallback = ^(BOOL canceled) { + JFFAsyncOperationChangeStateCallback stateCallback = ^(JFFAsyncOperationState state) { - if (canceled) { - [_queue didFinishActiveLoader:self]; - } - - if (_cancelCallback) { - JFFCancelAsyncOperationHandler cancelCallback = _cancelCallback; - _cancelCallback = nil; - cancelCallback(canceled); - } - - [self clear]; + if (_stateCallback) + _stateCallback(state); }; - JFFDidFinishAsyncOperationHandler doneCallback = ^(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { [_queue didFinishActiveLoader:self]; @@ -69,7 +60,7 @@ - (void)performLoader [self clear]; }; - _cancelLoader = _loader(progressCallback, cancelCallback, doneCallback); + _loadersHandler = _loader(progressCallback, stateCallback, doneCallback); } @end diff --git a/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFContextLoaders.h b/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFContextLoaders.h index b085540..411d5fb 100644 --- a/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFContextLoaders.h +++ b/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFContextLoaders.h @@ -8,36 +8,36 @@ @end -@interface JFFContextLoaders ( ActiveLoaders ) +@interface JFFContextLoaders (ActiveLoaders) @property (nonatomic, readonly) NSUInteger activeLoadersNumber; - (void)addActiveNativeLoader:(JFFAsyncOperation)nativeLoader - wrappedCancel:(JFFCancelAsyncOperation)cancel; + wrappedCancel:(JFFAsyncOperationHandler)cancel; - (BOOL)removeActiveNativeLoader:(JFFAsyncOperation)nativeLoader; -- (void)cancelActiveNativeLoader:(JFFAsyncOperation)nativeLoader cancel:(BOOL)canceled; +- (void)handleActiveNativeLoader:(JFFAsyncOperation)nativeLoader + withTask:(JFFAsyncOperationHandlerTask)task; @end @class JFFPedingLoaderData; -@interface JFFContextLoaders ( PendingLoaders ) +@interface JFFContextLoaders (PendingLoaders) @property (nonatomic, readonly) NSUInteger pendingLoadersNumber; - -- (JFFPedingLoaderData *)popPendingLoaderData; +@property (nonatomic, readonly) BOOL hasReadyToStartPendingLoaders; - (void)addPendingNativeLoader:(JFFAsyncOperation)nativeLoader - progressCallback:(JFFAsyncOperationProgressHandler)progressCallback - cancelCallback:(JFFCancelAsyncOperationHandler)cancelCallback - doneCallback:(JFFDidFinishAsyncOperationHandler)doneCallback; + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback + stateCallback:(JFFAsyncOperationChangeStateCallback)stateCallback + doneCallback:(JFFDidFinishAsyncOperationCallback)doneCallback; -- (BOOL)containsPendingNativeLoader:(JFFAsyncOperation)nativeLoader; +- (JFFPedingLoaderData *)popNotSuspendedPendingLoaderData; -- (void)removePendingNativeLoader:(JFFAsyncOperation)nativeLoader; +- (JFFPedingLoaderData *)pendingLoaderDataForNativeLoader:(JFFAsyncOperation)nativeLoader; -- (void)unsubscribePendingNativeLoader:(JFFAsyncOperation)nativeLoader; +- (void)removePedingLoaderData:(JFFPedingLoaderData *)data; @end diff --git a/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFContextLoaders.m b/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFContextLoaders.m index f3aba91..52335a1 100644 --- a/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFContextLoaders.m +++ b/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFContextLoaders.m @@ -35,11 +35,11 @@ - (NSUInteger)activeLoadersNumber } - (void)addActiveNativeLoader:(JFFAsyncOperation)nativeLoader - wrappedCancel:(JFFCancelAsyncOperation)cancel + wrappedCancel:(JFFAsyncOperationHandler)cancel { JFFActiveLoaderData *data = [JFFActiveLoaderData new]; - data.nativeLoader = nativeLoader; - data.wrappedCancel = cancel; + data.nativeLoader = nativeLoader; + data.wrappedHandler = cancel; [self.activeLoadersData addObject:data]; } @@ -52,12 +52,13 @@ - (JFFActiveLoaderData*)activeLoaderDataForNativeLoader:(JFFAsyncOperation)nativ }]; } -- (void)cancelActiveNativeLoader:(JFFAsyncOperation)nativeLoader cancel:(BOOL)canceled +- (void)handleActiveNativeLoader:(JFFAsyncOperation)nativeLoader + withTask:(JFFAsyncOperationHandlerTask)task { JFFActiveLoaderData *data = [self activeLoaderDataForNativeLoader:nativeLoader]; if (data) - data.wrappedCancel(canceled); + data.wrappedHandler(task); } - (BOOL)removeActiveNativeLoader:(JFFAsyncOperation)nativeLoader @@ -81,10 +82,26 @@ - (NSUInteger)pendingLoadersNumber return [_pendingLoadersData count]; } -- (JFFPedingLoaderData *)popPendingLoaderData +- (BOOL)hasReadyToStartPendingLoaders { - JFFPedingLoaderData *data = _pendingLoadersData[0]; - [_pendingLoadersData removeObjectAtIndex:0]; + return [_pendingLoadersData any:^BOOL(JFFPedingLoaderData *data) { + + return !data.suspended; + }]; +} + +- (JFFPedingLoaderData *)popPendingLoaderDataWithPredicate:(JFFPredicateBlock)predicate +{ + NSUInteger index = [_pendingLoadersData indexOfObjectPassingTest:^BOOL(JFFPedingLoaderData *data, NSUInteger idx, BOOL *stop) { + + return predicate(data); + }]; + + if (index == NSNotFound) + return nil; + + JFFPedingLoaderData *data = _pendingLoadersData[index]; + [_pendingLoadersData removeObjectAtIndex:index]; if ([_pendingLoadersData count] == 0) { _pendingLoadersData = nil; @@ -92,21 +109,32 @@ - (JFFPedingLoaderData *)popPendingLoaderData return data; } +- (JFFPedingLoaderData *)popNotSuspendedPendingLoaderData +{ + JFFPedingLoaderData *data = [self popPendingLoaderDataWithPredicate:^BOOL(JFFPedingLoaderData *data) { + + return !data.suspended; + }]; + + NSAssert(data != nil, @"invalid state preconditions for popNotSuspendedPendingLoaderData"); + return data; +} + - (void)addPendingNativeLoader:(JFFAsyncOperation)nativeLoader - progressCallback:(JFFAsyncOperationProgressHandler)progressCallback - cancelCallback:(JFFCancelAsyncOperationHandler)cancelCallback - doneCallback:(JFFDidFinishAsyncOperationHandler)doneCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback + stateCallback:(JFFAsyncOperationChangeStateCallback)stateCallback + doneCallback:(JFFDidFinishAsyncOperationCallback)doneCallback { JFFPedingLoaderData *data = [JFFPedingLoaderData new]; - data.nativeLoader = nativeLoader; + data.nativeLoader = nativeLoader ; data.progressCallback = progressCallback; - data.cancelCallback = cancelCallback; - data.doneCallback = doneCallback; + data.stateCallback = stateCallback ; + data.doneCallback = doneCallback ; [self.pendingLoadersData addObject:data]; } -- (JFFPedingLoaderData*)pendingLoaderDataForNativeLoader:(JFFAsyncOperation)nativeLoader +- (JFFPedingLoaderData *)pendingLoaderDataForNativeLoader:(JFFAsyncOperation)nativeLoader { return [self.pendingLoadersData firstMatch:^BOOL(id object) { @@ -115,26 +143,9 @@ - (JFFPedingLoaderData*)pendingLoaderDataForNativeLoader:(JFFAsyncOperation)nati }]; } -- (BOOL)containsPendingNativeLoader:(JFFAsyncOperation)nativeLoader -{ - return [self pendingLoaderDataForNativeLoader:nativeLoader] != nil; -} - -- (void)removePendingNativeLoader:(JFFAsyncOperation)nativeLoader +- (void)removePedingLoaderData:(JFFPedingLoaderData *)data { - JFFPedingLoaderData *data = [self pendingLoaderDataForNativeLoader:nativeLoader]; - [_pendingLoadersData removeObject:data]; } -- (void)unsubscribePendingNativeLoader:(JFFAsyncOperation)nativeLoader -{ - JFFPedingLoaderData *data = [self pendingLoaderDataForNativeLoader:nativeLoader]; - NSAssert(data, @"pending loader data should exist" ); - - data.progressCallback = nil; - data.cancelCallback = nil; - data.doneCallback = nil; -} - @end diff --git a/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFPedingLoaderData.h b/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFPedingLoaderData.h index 4c5f1df..6994908 100755 --- a/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFPedingLoaderData.h +++ b/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFPedingLoaderData.h @@ -5,8 +5,12 @@ @interface JFFPedingLoaderData : NSObject @property (nonatomic, copy) JFFAsyncOperation nativeLoader; -@property (nonatomic, copy) JFFAsyncOperationProgressHandler progressCallback; -@property (nonatomic, copy) JFFCancelAsyncOperationHandler cancelCallback; -@property (nonatomic, copy) JFFDidFinishAsyncOperationHandler doneCallback; +@property (nonatomic, copy) JFFAsyncOperationProgressCallback progressCallback; +@property (nonatomic, copy) JFFAsyncOperationChangeStateCallback stateCallback; +@property (nonatomic, copy) JFFDidFinishAsyncOperationCallback doneCallback; + +@property (nonatomic) BOOL suspended; + +- (void)unsubscribe; @end diff --git a/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFPedingLoaderData.m b/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFPedingLoaderData.m index fa8460f..26d93f9 100755 --- a/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFPedingLoaderData.m +++ b/lib/JFFAsyncOperations/LoadBalancer/Detail/JFFPedingLoaderData.m @@ -1,4 +1,12 @@ #import "JFFPedingLoaderData.h" @implementation JFFPedingLoaderData + +- (void)unsubscribe +{ + _progressCallback = nil; + _stateCallback = nil; + _doneCallback = nil; +} + @end diff --git a/lib/JFFAsyncOperations/LoadBalancer/JFFAsyncOperationLoadBalancer.m b/lib/JFFAsyncOperations/LoadBalancer/JFFAsyncOperationLoadBalancer.m index b8d7cab..f899e75 100644 --- a/lib/JFFAsyncOperations/LoadBalancer/JFFAsyncOperationLoadBalancer.m +++ b/lib/JFFAsyncOperations/LoadBalancer/JFFAsyncOperationLoadBalancer.m @@ -2,11 +2,14 @@ #import "JFFContextLoaders.h" #import "JFFPedingLoaderData.h" -#import "JFFAsyncOperationLoadBalancerContexts.h" +#import "JFFAsyncOperationsPredefinedBlocks.h" +#import "JFFAsyncOperationHandlerBlockHolder.h" #import "JFFAsyncOperationProgressBlockHolder.h" -#import "JFFCancelAsyncOperationBlockHolder.h" +#import "JFFAsyncOperationLoadBalancerContexts.h" #import "JFFDidFinishAsyncOperationBlockHolder.h" -#import "JFFAsyncOperationsPredefinedBlocks.h" + +#import "JFFAsyncOpFinishedByCancellationError.h" +#import "JFFAsyncOpFinishedByUnsubscriptionError.h" static const NSUInteger maxOperationCount = 5; static const NSUInteger totalMaxBackgroundCount = 2; @@ -38,19 +41,19 @@ void setBalancerActiveContextName(NSString *contextName) while (findAndTryToPerformNextNativeLoader()); } -NSString * balancerActiveContextName(void) +NSString *balancerActiveContextName(void) { return sharedBalancer().activeContextName; } -NSString * balancerCurrentContextName(void) +NSString *balancerCurrentContextName(void) { return sharedBalancer().currentContextName; } static void peformBlockWithinContext(JFFSimpleBlock block, JFFContextLoaders *contextLoaders) { - NSString* currentContextName = sharedBalancer().currentContextName; + NSString *currentContextName = sharedBalancer().currentContextName; sharedBalancer().currentContextName = contextLoaders.name; block(); @@ -67,24 +70,24 @@ static void performInBalancerPedingLoaderData(JFFPedingLoaderData *pendingLoader JFFAsyncOperation balancedLoader = wrappedAsyncOperationWithContext(pendingLoaderData.nativeLoader, contextLoaders); balancedLoader(pendingLoaderData.progressCallback, - pendingLoaderData.cancelCallback, + pendingLoaderData.stateCallback, pendingLoaderData.doneCallback); } static BOOL performLoaderFromContextIfPossible(JFFContextLoaders *contextLoaders) { - BOOL have_pending_loaders_ = (contextLoaders.pendingLoadersNumber > 0); - if ( have_pending_loaders_ - && canPeformAsyncOperationForContext(contextLoaders)) - { - JFFPedingLoaderData* pendingLoaderData_ = [ contextLoaders popPendingLoaderData ]; - performInBalancerPedingLoaderData( pendingLoaderData_, contextLoaders ); + BOOL havePendingLoaders = contextLoaders.hasReadyToStartPendingLoaders; + if (havePendingLoaders + && canPeformAsyncOperationForContext(contextLoaders)) { + + JFFPedingLoaderData *pendingLoaderData = [contextLoaders popNotSuspendedPendingLoaderData]; + performInBalancerPedingLoaderData(pendingLoaderData, contextLoaders); return YES; } return NO; } -static BOOL findAndTryToPerformNextNativeLoader( void ) +static BOOL findAndTryToPerformNextNativeLoader(void) { JFFAsyncOperationLoadBalancerContexts *balancer = sharedBalancer(); @@ -138,33 +141,9 @@ static void finishExecuteOfNativeLoader( JFFAsyncOperation nativeLoader } } -static JFFCancelAsyncOperationHandler cancelCallbackWrapper(JFFCancelAsyncOperationHandler nativeCancelCallback, - JFFAsyncOperation nativeLoader, - JFFContextLoaders *contextLoaders) -{ - nativeCancelCallback = [nativeCancelCallback copy]; - return ^void(BOOL canceled) { - - if (!canceled) { - NSCAssert(NO, @"balanced loaders should not be unsubscribed from native loader not supported yet"); - return; - } - - finishExecuteOfNativeLoader(nativeLoader, contextLoaders); - - if (nativeCancelCallback) { - peformBlockWithinContext(^{ - nativeCancelCallback(canceled); - }, contextLoaders); - } - - findAndTryToPerformNextNativeLoader(); - }; -} - -static JFFDidFinishAsyncOperationHandler doneCallbackWrapper(JFFDidFinishAsyncOperationHandler nativeDoneCallback, - JFFAsyncOperation nativeLoader, - JFFContextLoaders* contextLoaders) +static JFFDidFinishAsyncOperationCallback doneCallbackWrapper(JFFDidFinishAsyncOperationCallback nativeDoneCallback, + JFFAsyncOperation nativeLoader, + JFFContextLoaders* contextLoaders) { nativeDoneCallback = [nativeDoneCallback copy]; @@ -190,14 +169,14 @@ static JFFAsyncOperation wrappedAsyncOperationWithContext(JFFAsyncOperation nati NSCParameterAssert(nativeLoader); nativeLoader = [nativeLoader copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler nativeProgressCallback, - JFFCancelAsyncOperationHandler nativeCancelCallback, - JFFDidFinishAsyncOperationHandler nativeDoneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback nativeProgressCallback, + JFFAsyncOperationChangeStateCallback nativeStateCallback, + JFFDidFinishAsyncOperationCallback nativeDoneCallback) { //progress holder for unsubscribe JFFAsyncOperationProgressBlockHolder *progressBlockHolder = [JFFAsyncOperationProgressBlockHolder new]; progressBlockHolder.progressBlock = nativeProgressCallback; - JFFAsyncOperationProgressHandler wrappedProgressCallback = ^void(id progressInfo) { + JFFAsyncOperationProgressCallback wrappedProgressCallback = ^void(id progressInfo) { peformBlockWithinContext( ^ { [progressBlockHolder performProgressBlockWithArgument:progressInfo]; }, contextLoaders); @@ -205,49 +184,47 @@ static JFFAsyncOperation wrappedAsyncOperationWithContext(JFFAsyncOperation nati __block BOOL done = NO; - //cancel holder for unsubscribe - JFFCancelAsyncOperationBlockHolder *cancelCallbackBlockHolder = [JFFCancelAsyncOperationBlockHolder new]; - cancelCallbackBlockHolder.cancelBlock = nativeCancelCallback; - JFFCancelAsyncOperation wrappedCancelCallback = ^void(BOOL canceled) { - done = YES; - cancelCallbackBlockHolder.onceCancelBlock(canceled); + __block JFFAsyncOperationChangeStateCallback nativeStateCallbackHolder = nativeStateCallback; + JFFAsyncOperationChangeStateCallback wrappedStateCallback = ^void(JFFAsyncOperationState state) { + + if (nativeStateCallbackHolder) + nativeStateCallbackHolder(state); }; //finish holder for unsubscribe JFFDidFinishAsyncOperationBlockHolder *finishBlockHolder = [JFFDidFinishAsyncOperationBlockHolder new]; finishBlockHolder.didFinishBlock = nativeDoneCallback; - JFFDidFinishAsyncOperationHandler wrappedDoneCallback = ^void(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback wrappedDoneCallback = ^void(id result, NSError *error) { done = YES; finishBlockHolder.onceDidFinishBlock(result, error); }; - wrappedCancelCallback = cancelCallbackWrapper(wrappedCancelCallback, - nativeLoader, - contextLoaders); - wrappedDoneCallback = doneCallbackWrapper(wrappedDoneCallback, nativeLoader, contextLoaders); // JTODO check native loader no within balancer !!! - JFFCancelAsyncOperation cancelBlock = nativeLoader(wrappedProgressCallback, - wrappedCancelCallback, - wrappedDoneCallback); + JFFAsyncOperationHandler nativeHandler = nativeLoader(wrappedProgressCallback, + wrappedStateCallback, + wrappedDoneCallback); if (done) { - return JFFStubCancelAsyncOperationBlock; + return JFFStubHandlerAsyncOperationBlock; } ++totalActiveNumber; - JFFCancelAsyncOperation wrappedCancelBlock = [^void(BOOL canceled) { - if (canceled) { - cancelBlock(YES); + JFFAsyncOperationHandler wrappedCancelBlock = [^void(JFFAsyncOperationHandlerTask task) { + + if (JFFAsyncOperationHandlerTaskUnSubscribe == task) { + + finishBlockHolder.onceDidFinishBlock(nil, [JFFAsyncOpFinishedByUnsubscriptionError new]); + + nativeStateCallbackHolder = nil; + progressBlockHolder.progressBlock = nil; } else { - cancelCallbackBlockHolder.onceCancelBlock(NO); - progressBlockHolder.progressBlock = nil; - finishBlockHolder.didFinishBlock = nil; + nativeHandler(task); } } copy]; @@ -286,9 +263,9 @@ JFFAsyncOperation balancedAsyncOperationInContext(JFFAsyncOperation nativeLoader NSCParameterAssert(nativeLoader); nativeLoader = [nativeLoader copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback hendlerCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { JFFContextLoaders *contextLoaders = [sharedBalancer() contextLoadersForName:contextName]; @@ -296,32 +273,58 @@ JFFAsyncOperation balancedAsyncOperationInContext(JFFAsyncOperation nativeLoader JFFAsyncOperation contextLoader = wrappedAsyncOperationWithContext(nativeLoader, contextLoaders); - return contextLoader(progressCallback, cancelCallback, doneCallback); + return contextLoader(progressCallback, hendlerCallback, doneCallback); } - cancelCallback = [cancelCallback copy]; + hendlerCallback = [hendlerCallback copy]; [contextLoaders addPendingNativeLoader:nativeLoader progressCallback:progressCallback - cancelCallback:cancelCallback + stateCallback:hendlerCallback doneCallback:doneCallback]; logBalancerState(contextLoaders); - JFFCancelAsyncOperation cancel = ^void(BOOL canceled) { + JFFAsyncOperationHandler cancel = ^void(JFFAsyncOperationHandlerTask task) { - if (![contextLoaders containsPendingNativeLoader:nativeLoader]) { + JFFPedingLoaderData *pedingLoaderData = [contextLoaders pendingLoaderDataForNativeLoader:nativeLoader]; + + if (!pedingLoaderData) { //cancel only wrapped cancel block - [contextLoaders cancelActiveNativeLoader:nativeLoader cancel:canceled]; + [contextLoaders handleActiveNativeLoader:nativeLoader withTask:task]; return; } - if (canceled) { - [contextLoaders removePendingNativeLoader:nativeLoader]; - cancelCallback(YES); - } else { - cancelCallback(NO); - - [contextLoaders unsubscribePendingNativeLoader:nativeLoader]; + switch (task) { + case JFFAsyncOperationHandlerTaskUnSubscribe: + { + [pedingLoaderData unsubscribe]; + if (doneCallback) + doneCallback(nil, [JFFAsyncOpFinishedByUnsubscriptionError new]); + break; + } + case JFFAsyncOperationHandlerTaskCancel: + { + [contextLoaders removePedingLoaderData:pedingLoaderData]; + if (doneCallback) + doneCallback(nil, [JFFAsyncOpFinishedByCancellationError new]); + break; + } + case JFFAsyncOperationHandlerTaskResume: + { + pedingLoaderData.suspended = NO; + findAndTryToPerformNextNativeLoader(); + break; + } + case JFFAsyncOperationHandlerTaskSuspend: + { + pedingLoaderData.suspended = YES; + break; + } + default: + { + NSCAssert1(NO, @"balancer not implemeted for handler task: %lu", (unsigned long)task); + break; + } } }; diff --git a/lib/JFFAsyncOperations/LoadBalancer/JFFLimitedLoadersQueue.m b/lib/JFFAsyncOperations/LoadBalancer/JFFLimitedLoadersQueue.m index aa58dc8..a2e583d 100644 --- a/lib/JFFAsyncOperations/LoadBalancer/JFFLimitedLoadersQueue.m +++ b/lib/JFFAsyncOperations/LoadBalancer/JFFLimitedLoadersQueue.m @@ -1,9 +1,11 @@ #import "JFFLimitedLoadersQueue.h" -#import "JFFBaseLoaderOwner.h" #import "JFFQueueStrategy.h" -#import "JFFQueueStrategyFactory.h" #import "JFFQueueState.h" +#import "JFFBaseLoaderOwner.h" +#import "JFFQueueStrategyFactory.h" + +#import "JFFAsyncOpFinishedByCancellationError.h" @implementation JFFLimitedLoadersQueue { @@ -48,12 +50,9 @@ - (BOOL)hasLoadersReadyToStartForPendingLoader:(JFFBaseLoaderOwner *)pendingLoad BOOL result = _limitCount > [_activeLoaders count] && [_pendingLoaders count] > 0; - if (result) { - - result = [_activeLoaders all:^BOOL(JFFBaseLoaderOwner *activeLoader) { - return !activeLoader.barrier; - }]; - } + result = result && [_activeLoaders all:^BOOL(JFFBaseLoaderOwner *activeLoader) { + return !activeLoader.barrier; + }]; return result; } @@ -89,17 +88,16 @@ - (JFFAsyncOperation)balancedLoaderWithLoader:(JFFAsyncOperation)loader barrier:(BOOL)barrier { loader = [loader copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { - JFFBaseLoaderOwner *loaderHolder = - [JFFBaseLoaderOwner newLoaderOwnerWithLoader:loader - queue:self]; + JFFBaseLoaderOwner *loaderHolder = [JFFBaseLoaderOwner newLoaderOwnerWithLoader:loader + queue:self]; loaderHolder.barrier = barrier; loaderHolder.progressCallback = progressCallback; - loaderHolder.cancelCallback = cancelCallback; + loaderHolder.stateCallback = stateCallback; loaderHolder.doneCallback = doneCallback; [_pendingLoaders addObject:loaderHolder]; @@ -108,29 +106,40 @@ - (JFFAsyncOperation)balancedLoaderWithLoader:(JFFAsyncOperation)loader __weak JFFBaseLoaderOwner *weakLoaderHolder = loaderHolder; - return ^(BOOL canceled) { + return ^(JFFAsyncOperationHandlerTask task) { JFFBaseLoaderOwner *loaderHolder = weakLoaderHolder; if (!loaderHolder) return; - JFFCancelAsyncOperationHandler cancelCallback = loaderHolder.cancelCallback; - - if (canceled) { - if (!loaderHolder.cancelLoader) { - //TODO self owning here fix? - [_pendingLoaders removeObject:loaderHolder]; + switch (task) { + case JFFAsyncOperationHandlerTaskUnSubscribe: + { + loaderHolder.progressCallback = nil; + loaderHolder.stateCallback = nil; + loaderHolder.doneCallback = nil; + break; + } + case JFFAsyncOperationHandlerTaskCancel: + { + if (loaderHolder.loadersHandler) { + + loaderHolder.loadersHandler(JFFAsyncOperationHandlerTaskCancel); + } else { + + //TODO self owning here fix? + JFFDidFinishAsyncOperationCallback doneCallback = loaderHolder.doneCallback; + [_pendingLoaders removeObject:loaderHolder]; + if (doneCallback) + doneCallback(nil, [JFFAsyncOpFinishedByCancellationError new]); + } + break; + } + default: + { + NSCAssert(NO, @"Unsupported type of task: %lu", (unsigned long)task); + break; } - } else { - loaderHolder.progressCallback = nil; - loaderHolder.cancelCallback = nil; - loaderHolder.doneCallback = nil; - } - - if (loaderHolder.cancelLoader) { - loaderHolder.cancelLoader(YES); - } else if (cancelCallback) { - cancelCallback(canceled); } }; }; diff --git a/lib/JFFAsyncOperations/NSObject+AutoCancelAsyncOperation.m b/lib/JFFAsyncOperations/NSObject+AutoCancelAsyncOperation.m index ada707b..3679690 100755 --- a/lib/JFFAsyncOperations/NSObject+AutoCancelAsyncOperation.m +++ b/lib/JFFAsyncOperations/NSObject+AutoCancelAsyncOperation.m @@ -2,29 +2,30 @@ #import "JFFAsyncOperationsPredefinedBlocks.h" #import "JFFDidFinishAsyncOperationBlockHolder.h" +#import "JFFAsyncOperationAbstractFinishError.h" @implementation NSObject (WeakAsyncOperation) - (JFFAsyncOperation)autoUnsibscribeOrCancelAsyncOperation:(JFFAsyncOperation)nativeAsyncOp - cancel:(BOOL)cancelNativeAsyncOp + task:(JFFAsyncOperationHandlerTask)task { NSParameterAssert(nativeAsyncOp); __weak id weakSelf = self; nativeAsyncOp = [nativeAsyncOp copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { id self_ = weakSelf; if (self_ == nil) { - if (cancelCallback) { - cancelCallback(cancelNativeAsyncOp); - } - return JFFStubCancelAsyncOperationBlock; + NSError *error = [JFFAsyncOperationAbstractFinishError newAsyncOperationAbstractFinishErrorWithHandlerTask:task]; + if (doneCallback) + doneCallback(nil, error); + return JFFStubHandlerAsyncOperationBlock; } __block BOOL finished = NO; @@ -41,50 +42,44 @@ - (JFFAsyncOperation)autoUnsibscribeOrCancelAsyncOperation:(JFFAsyncOperation)na } }; - __block JFFCancelAsyncOperation cancelCallbackHolder; - cancelCallbackHolder = [cancelCallback copy]; - JFFCancelAsyncOperationHandler cancelCallbackWrapper = ^void(BOOL cancelOp) { - removeOndeallocBlockHolder.onceSimpleBlock(); - if (cancelCallbackHolder) { - cancelCallbackHolder(cancelOp); - cancelCallbackHolder = nil; - } - }; - JFFDidFinishAsyncOperationBlockHolder *doneCallbackHolder = [JFFDidFinishAsyncOperationBlockHolder new]; doneCallbackHolder.didFinishBlock = doneCallback; - JFFDidFinishAsyncOperationHandler doneCallbackWrapper = ^void(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallbackWrapper = ^void(id result, NSError *error) { removeOndeallocBlockHolder.onceSimpleBlock(); doneCallbackHolder.onceDidFinishBlock(result, error); }; - JFFCancelAsyncOperation cancel = nativeAsyncOp(progressCallback, - cancelCallbackWrapper, - doneCallbackWrapper); + JFFAsyncOperationHandler loadersHandler = nativeAsyncOp(progressCallback, + stateCallback, + doneCallbackWrapper); if (finished) { - return JFFStubCancelAsyncOperationBlock; + return JFFStubHandlerAsyncOperationBlock; } - + //TODO remove using of ondealloc block holder class ondeallocBlockHolder.simpleBlock = ^void(void) { - cancel(cancelNativeAsyncOp); + loadersHandler(task); }; //try assert retain count [self_ addOnDeallocBlock:ondeallocBlockHolder.onceSimpleBlock]; - __block JFFCancelAsyncOperation cancelBlockHolder = [^void(BOOL canceled) { - cancel(canceled); + __block JFFAsyncOperationHandler handlerBlockHolder = [^void(JFFAsyncOperationHandlerTask task) { + loadersHandler(task); } copy]; - return ^(BOOL canceled) { - JFFCancelAsyncOperation cancel = cancelBlockHolder; - if (!cancel) + return ^(JFFAsyncOperationHandlerTask task) { + + JFFAsyncOperationHandler hadler = handlerBlockHolder; + if (!hadler) return; - cancelBlockHolder = nil; - cancel(canceled); + + if (task <= JFFAsyncOperationHandlerTaskCancel) { + handlerBlockHolder = nil; + } + hadler(task); }; }; } @@ -92,13 +87,13 @@ - (JFFAsyncOperation)autoUnsibscribeOrCancelAsyncOperation:(JFFAsyncOperation)na - (JFFAsyncOperation)autoUnsubsribeOnDeallocAsyncOperation:(JFFAsyncOperation)nativeLoader { return [self autoUnsibscribeOrCancelAsyncOperation:nativeLoader - cancel:NO]; + task:JFFAsyncOperationHandlerTaskUnsubscribe]; } - (JFFAsyncOperation)autoCancelOnDeallocAsyncOperation:(JFFAsyncOperation)nativeLoader { return [self autoUnsibscribeOrCancelAsyncOperation:nativeLoader - cancel:YES]; + task:JFFAsyncOperationHandlerTaskCancel]; } @end diff --git a/lib/JFFAsyncOperations/Tools/JFFAsyncTools.h b/lib/JFFAsyncOperations/Tools/JFFAsyncTools.h new file mode 100644 index 0000000..2013cf7 --- /dev/null +++ b/lib/JFFAsyncOperations/Tools/JFFAsyncTools.h @@ -0,0 +1,16 @@ +#import + +#import + +#ifdef __cplusplus +extern "C" { +#endif + + typedef uintptr_t (^JFFFileHendlerBuilder)(void); + + JFFAsyncOperation jFileDescriptorReader(JFFFileHendlerBuilder handleBuilder, + dispatch_queue_t queue); + +#ifdef __cplusplus +} /* closing brace for extern "C" */ +#endif diff --git a/lib/JFFAsyncOperations/Tools/JFFAsyncTools.m b/lib/JFFAsyncOperations/Tools/JFFAsyncTools.m new file mode 100644 index 0000000..70d3db8 --- /dev/null +++ b/lib/JFFAsyncOperations/Tools/JFFAsyncTools.m @@ -0,0 +1,190 @@ +#import "JFFAsyncTools.h" + +#import "JFFAsyncOperationHelpers.h" +#import "JFFAsyncOperationsPredefinedBlocks.h" + +#import "JFFAsyncOperationBuilder.h" +#import "JFFAsyncOperationInterface.h" + +#import "JFFFileDescriptorReaderError.h" + +#include + +@interface JFFAsyncFileReader : NSObject +@end + +@implementation JFFAsyncFileReader +{ + dispatch_source_t _inputSrc; + char *_readBuffer; +@public + JFFFileHendlerBuilder _handleBuilder; + dispatch_queue_t _queue; +} + +- (void)dealloc +{ + +} + +//https://developer.apple.com/library/ios/DOCUMENTATION/General/Conceptual/ConcurrencyProgrammingGuide/GCDWorkQueues/GCDWorkQueues.html + +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finnishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback +{ + _readBuffer = NULL; + + uintptr_t handle = _handleBuilder(); + + int result = fcntl(handle, F_SETFL, O_NONBLOCK); + //FILE * stream = fdopen(handle, "r"); + + if (result == -1) { + + if (finnishCallback) + finnishCallback(nil, [JFFFileDescriptorReaderError new]); + return; + } + + _inputSrc = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, handle, 0, _queue); + + //TODO implement lseek + +// dispatch_connect(); +// dispatch_read(); + + dispatch_source_set_event_handler(_inputSrc, ^{ + + //process_input(my_file); + + unsigned long availableToRead = dispatch_source_get_data(_inputSrc); + + _readBuffer = reallocf(_readBuffer, availableToRead); + + if (_readBuffer == NULL) { + + ///TODO change error + if (finnishCallback) + finnishCallback(nil, [JFFFileDescriptorReaderError new]); + return; + } + + ssize_t result = read(handle, _readBuffer, availableToRead); + + if (result < 0) { + + ///TODO change error + if (finnishCallback) + finnishCallback(nil, [JFFFileDescriptorReaderError new]); + return; + } + + if (progressCallback && result > 0) { + + NSData *chunk = [NSData dataWithBytesNoCopy:_readBuffer length:result]; + progressCallback(chunk); + } + + FILE *f = fdopen(handle, "r"); + if (feof(f)) { + + if (finnishCallback) + finnishCallback(@YES, nil); + return; + } + + off_t offset = lseek(handle, 0, SEEK_CUR); + + if (offset == EOF) { + + if (finnishCallback) + finnishCallback(@YES, nil); + } + + { + struct stat buf; + fstat(handle, &buf); + int size = buf.st_size; + + if (size == offset) { + + if (finnishCallback) + finnishCallback(@YES, nil); + } + } + + +// if (feof(stream)) { +// +// if (finnishCallback) +// finnishCallback(@YES, nil); +// } + }); + + dispatch_source_set_cancel_handler(_inputSrc, ^{ + + //fclose(stream); + close(handle); + + if (_readBuffer != NULL) { + free(_readBuffer); + _readBuffer = NULL; + } + }); + + dispatch_resume(_inputSrc); +} + +- (void)doTask:(JFFAsyncOperationHandlerTask)task +{ + switch (task) { + case JFFAsyncOperationHandlerTaskUnsubscribe: + { + break; + } + case JFFAsyncOperationHandlerTaskCancel: + { + dispatch_source_cancel(_inputSrc); + break; + } + case JFFAsyncOperationHandlerTaskResume: + { + dispatch_resume(_inputSrc); + break; + } + case JFFAsyncOperationHandlerTaskSuspend: + { + dispatch_suspend(_inputSrc); + break; + } + default: + { + NSAssert1(NO, @"unsupported task: %lu", (unsigned long)task); + break; + } + } +} + +@end + +JFFAsyncOperation jFileDescriptorReader(JFFFileHendlerBuilder handleBuilder, + dispatch_queue_t queue) +{ + handleBuilder = [handleBuilder copy]; + + id (^factory)(void) = ^id(void) { + + JFFAsyncFileReader *result = [JFFAsyncFileReader new]; + + if (result) { + + result->_handleBuilder = handleBuilder; + result->_queue = queue; + } + + return result; + }; + + return buildAsyncOperationWithAdapterFactoryWithDispatchQueue(factory, queue); +} diff --git a/lib/JFFCache/JFFCache.xcodeproj/project.pbxproj b/lib/JFFCache/JFFCache.xcodeproj/project.pbxproj index c785d6f..610db80 100644 --- a/lib/JFFCache/JFFCache.xcodeproj/project.pbxproj +++ b/lib/JFFCache/JFFCache.xcodeproj/project.pbxproj @@ -9,18 +9,20 @@ /* Begin PBXBuildFile section */ 4C0D56E617E70F4A001F0944 /* JFFCacheLoadImageError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C0D56E417E70F4A001F0944 /* JFFCacheLoadImageError.h */; }; 4C0D56E717E70F4A001F0944 /* JFFCacheLoadImageError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0D56E517E70F4A001F0944 /* JFFCacheLoadImageError.m */; }; + 4C236BF818759C3F0027B50A /* CacheDBInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C236BF618759C3F0027B50A /* CacheDBInfo.h */; }; + 4C236BF918759C3F0027B50A /* CacheDBInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C236BF718759C3F0027B50A /* CacheDBInfo.m */; }; + 4C236BFC1875B7870027B50A /* JFFKeyValueDB.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C236BFA1875B7870027B50A /* JFFKeyValueDB.h */; }; + 4C236BFD1875B7870027B50A /* JFFKeyValueDB.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C236BFB1875B7870027B50A /* JFFKeyValueDB.m */; }; 4CA0CAA816CE864C0007A85D /* JFFCacheError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CA0CAA616CE864C0007A85D /* JFFCacheError.h */; }; 4CA0CAA916CE864C0007A85D /* JFFCacheError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0CAA716CE864C0007A85D /* JFFCacheError.m */; }; - 4CA0CAC116CE86B90007A85D /* NSDictionary+DBInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CA0CAAB16CE86B80007A85D /* NSDictionary+DBInfo.h */; }; - 4CA0CAC216CE86B90007A85D /* NSDictionary+DBInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0CAAC16CE86B80007A85D /* NSDictionary+DBInfo.m */; }; + 4CA0CAC116CE86B90007A85D /* CacheDBInfoStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CA0CAAB16CE86B80007A85D /* CacheDBInfoStorage.h */; }; + 4CA0CAC216CE86B90007A85D /* CacheDBInfoStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0CAAC16CE86B80007A85D /* CacheDBInfoStorage.m */; }; 4CA0CAC316CE86B90007A85D /* NSObject+CompositeKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CA0CAAD16CE86B80007A85D /* NSObject+CompositeKey.h */; }; 4CA0CAC416CE86B90007A85D /* NSObject+CompositeKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0CAAE16CE86B80007A85D /* NSObject+CompositeKey.m */; }; 4CA0CAC516CE86B90007A85D /* NSString+CacheFSManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CA0CAAF16CE86B80007A85D /* NSString+CacheFSManager.h */; }; 4CA0CAC616CE86B90007A85D /* NSString+CacheFSManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0CAB016CE86B80007A85D /* NSString+CacheFSManager.m */; }; 4CA0CAC716CE86B90007A85D /* NSString+CompositeKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CA0CAB116CE86B80007A85D /* NSString+CompositeKey.h */; }; 4CA0CAC816CE86B90007A85D /* NSString+CompositeKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0CAB216CE86B80007A85D /* NSString+CompositeKey.m */; }; - 4CA0CAC916CE86B90007A85D /* JFFBaseDB.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CA0CAB316CE86B80007A85D /* JFFBaseDB.h */; }; - 4CA0CACA16CE86B90007A85D /* JFFBaseDB.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0CAB416CE86B80007A85D /* JFFBaseDB.m */; }; 4CA0CACB16CE86B90007A85D /* JFFCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CA0CAB516CE86B80007A85D /* JFFCache.h */; }; 4CA0CACC16CE86B90007A85D /* JFFCacheDB.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CA0CAB616CE86B80007A85D /* JFFCacheDB.h */; }; 4CA0CACD16CE86B90007A85D /* JFFCaches.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CA0CAB716CE86B80007A85D /* JFFCaches.h */; }; @@ -29,8 +31,6 @@ 4CA0CAD016CE86B90007A85D /* JFFDBCompositeKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0CABA16CE86B90007A85D /* JFFDBCompositeKey.m */; }; 4CA0CAD116CE86B90007A85D /* JFFDBInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CA0CABB16CE86B90007A85D /* JFFDBInfo.h */; }; 4CA0CAD216CE86B90007A85D /* JFFDBInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0CABC16CE86B90007A85D /* JFFDBInfo.m */; }; - 4CA0CAD316CE86B90007A85D /* JFFDBManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CA0CABD16CE86B90007A85D /* JFFDBManager.h */; }; - 4CA0CAD416CE86B90007A85D /* JFFDBManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0CABE16CE86B90007A85D /* JFFDBManager.m */; }; 4CA0CAD516CE86B90007A85D /* JFFThumbnailStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CA0CABF16CE86B90007A85D /* JFFThumbnailStorage.h */; }; 4CA0CAD616CE86B90007A85D /* JFFThumbnailStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0CAC016CE86B90007A85D /* JFFThumbnailStorage.m */; }; 4CA0CAD916CE86F70007A85D /* JFFCacheNoURLError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CA0CAD716CE86F70007A85D /* JFFCacheNoURLError.h */; }; @@ -43,18 +43,20 @@ /* Begin PBXFileReference section */ 4C0D56E417E70F4A001F0944 /* JFFCacheLoadImageError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFCacheLoadImageError.h; sourceTree = ""; }; 4C0D56E517E70F4A001F0944 /* JFFCacheLoadImageError.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFCacheLoadImageError.m; sourceTree = ""; }; + 4C236BF618759C3F0027B50A /* CacheDBInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CacheDBInfo.h; sourceTree = ""; }; + 4C236BF718759C3F0027B50A /* CacheDBInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CacheDBInfo.m; sourceTree = ""; }; + 4C236BFA1875B7870027B50A /* JFFKeyValueDB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFKeyValueDB.h; sourceTree = ""; }; + 4C236BFB1875B7870027B50A /* JFFKeyValueDB.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFKeyValueDB.m; sourceTree = ""; }; 4CA0CAA616CE864C0007A85D /* JFFCacheError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFCacheError.h; sourceTree = ""; }; 4CA0CAA716CE864C0007A85D /* JFFCacheError.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFCacheError.m; sourceTree = ""; }; - 4CA0CAAB16CE86B80007A85D /* NSDictionary+DBInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+DBInfo.h"; sourceTree = ""; }; - 4CA0CAAC16CE86B80007A85D /* NSDictionary+DBInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+DBInfo.m"; sourceTree = ""; }; + 4CA0CAAB16CE86B80007A85D /* CacheDBInfoStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CacheDBInfoStorage.h; sourceTree = ""; }; + 4CA0CAAC16CE86B80007A85D /* CacheDBInfoStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CacheDBInfoStorage.m; sourceTree = ""; }; 4CA0CAAD16CE86B80007A85D /* NSObject+CompositeKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+CompositeKey.h"; sourceTree = ""; }; 4CA0CAAE16CE86B80007A85D /* NSObject+CompositeKey.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+CompositeKey.m"; sourceTree = ""; }; 4CA0CAAF16CE86B80007A85D /* NSString+CacheFSManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+CacheFSManager.h"; sourceTree = ""; }; 4CA0CAB016CE86B80007A85D /* NSString+CacheFSManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+CacheFSManager.m"; sourceTree = ""; }; 4CA0CAB116CE86B80007A85D /* NSString+CompositeKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+CompositeKey.h"; sourceTree = ""; }; 4CA0CAB216CE86B80007A85D /* NSString+CompositeKey.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+CompositeKey.m"; sourceTree = ""; }; - 4CA0CAB316CE86B80007A85D /* JFFBaseDB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFBaseDB.h; sourceTree = ""; }; - 4CA0CAB416CE86B80007A85D /* JFFBaseDB.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFBaseDB.m; sourceTree = ""; }; 4CA0CAB516CE86B80007A85D /* JFFCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFCache.h; sourceTree = ""; }; 4CA0CAB616CE86B80007A85D /* JFFCacheDB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFCacheDB.h; sourceTree = ""; }; 4CA0CAB716CE86B80007A85D /* JFFCaches.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFCaches.h; sourceTree = ""; }; @@ -63,8 +65,6 @@ 4CA0CABA16CE86B90007A85D /* JFFDBCompositeKey.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFDBCompositeKey.m; sourceTree = ""; }; 4CA0CABB16CE86B90007A85D /* JFFDBInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFDBInfo.h; sourceTree = ""; }; 4CA0CABC16CE86B90007A85D /* JFFDBInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFDBInfo.m; sourceTree = ""; }; - 4CA0CABD16CE86B90007A85D /* JFFDBManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFDBManager.h; sourceTree = ""; }; - 4CA0CABE16CE86B90007A85D /* JFFDBManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFDBManager.m; sourceTree = ""; }; 4CA0CABF16CE86B90007A85D /* JFFThumbnailStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFThumbnailStorage.h; sourceTree = ""; }; 4CA0CAC016CE86B90007A85D /* JFFThumbnailStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFThumbnailStorage.m; sourceTree = ""; }; 4CA0CAD716CE86F70007A85D /* JFFCacheNoURLError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFCacheNoURLError.h; sourceTree = ""; }; @@ -105,14 +105,18 @@ 4CA0CAAA16CE86B80007A85D /* Details */ = { isa = PBXGroup; children = ( - 4CA0CAAB16CE86B80007A85D /* NSDictionary+DBInfo.h */, - 4CA0CAAC16CE86B80007A85D /* NSDictionary+DBInfo.m */, + 4C236BF618759C3F0027B50A /* CacheDBInfo.h */, + 4C236BF718759C3F0027B50A /* CacheDBInfo.m */, + 4CA0CAAB16CE86B80007A85D /* CacheDBInfoStorage.h */, + 4CA0CAAC16CE86B80007A85D /* CacheDBInfoStorage.m */, 4CA0CAAD16CE86B80007A85D /* NSObject+CompositeKey.h */, 4CA0CAAE16CE86B80007A85D /* NSObject+CompositeKey.m */, 4CA0CAAF16CE86B80007A85D /* NSString+CacheFSManager.h */, 4CA0CAB016CE86B80007A85D /* NSString+CacheFSManager.m */, 4CA0CAB116CE86B80007A85D /* NSString+CompositeKey.h */, 4CA0CAB216CE86B80007A85D /* NSString+CompositeKey.m */, + 4C236BFA1875B7870027B50A /* JFFKeyValueDB.h */, + 4C236BFB1875B7870027B50A /* JFFKeyValueDB.m */, ); path = Details; sourceTree = ""; @@ -157,8 +161,6 @@ 4CB92AE216FA02E600471165 /* Categories */, 4CA0CAA516CE86320007A85D /* Errors */, 4CA0CAAA16CE86B80007A85D /* Details */, - 4CA0CAB316CE86B80007A85D /* JFFBaseDB.h */, - 4CA0CAB416CE86B80007A85D /* JFFBaseDB.m */, 4CA0CAB616CE86B80007A85D /* JFFCacheDB.h */, 4CA0CAB716CE86B80007A85D /* JFFCaches.h */, 4CA0CAB816CE86B80007A85D /* JFFCaches.m */, @@ -166,8 +168,6 @@ 4CA0CABA16CE86B90007A85D /* JFFDBCompositeKey.m */, 4CA0CABB16CE86B90007A85D /* JFFDBInfo.h */, 4CA0CABC16CE86B90007A85D /* JFFDBInfo.m */, - 4CA0CABD16CE86B90007A85D /* JFFDBManager.h */, - 4CA0CABE16CE86B90007A85D /* JFFDBManager.m */, 4CA0CABF16CE86B90007A85D /* JFFThumbnailStorage.h */, 4CA0CAC016CE86B90007A85D /* JFFThumbnailStorage.m */, 4CA0CAB516CE86B80007A85D /* JFFCache.h */, @@ -201,17 +201,17 @@ buildActionMask = 2147483647; files = ( 4CA0CAA816CE864C0007A85D /* JFFCacheError.h in Headers */, - 4CA0CAC116CE86B90007A85D /* NSDictionary+DBInfo.h in Headers */, + 4CA0CAC116CE86B90007A85D /* CacheDBInfoStorage.h in Headers */, 4CA0CAC316CE86B90007A85D /* NSObject+CompositeKey.h in Headers */, 4CA0CAC516CE86B90007A85D /* NSString+CacheFSManager.h in Headers */, 4CA0CAC716CE86B90007A85D /* NSString+CompositeKey.h in Headers */, - 4CA0CAC916CE86B90007A85D /* JFFBaseDB.h in Headers */, + 4C236BF818759C3F0027B50A /* CacheDBInfo.h in Headers */, 4CA0CACB16CE86B90007A85D /* JFFCache.h in Headers */, 4CA0CACC16CE86B90007A85D /* JFFCacheDB.h in Headers */, 4CA0CACD16CE86B90007A85D /* JFFCaches.h in Headers */, 4CA0CACF16CE86B90007A85D /* JFFDBCompositeKey.h in Headers */, 4CA0CAD116CE86B90007A85D /* JFFDBInfo.h in Headers */, - 4CA0CAD316CE86B90007A85D /* JFFDBManager.h in Headers */, + 4C236BFC1875B7870027B50A /* JFFKeyValueDB.h in Headers */, 4CA0CAD516CE86B90007A85D /* JFFThumbnailStorage.h in Headers */, 4CA0CAD916CE86F70007A85D /* JFFCacheNoURLError.h in Headers */, 4C0D56E617E70F4A001F0944 /* JFFCacheLoadImageError.h in Headers */, @@ -245,7 +245,7 @@ 6516846E144F4ECD0014670E /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0510; }; buildConfigurationList = 65168471144F4ECD0014670E /* Build configuration list for PBXProject "JFFCache" */; compatibilityVersion = "Xcode 3.2"; @@ -270,16 +270,16 @@ buildActionMask = 2147483647; files = ( 4CA0CAA916CE864C0007A85D /* JFFCacheError.m in Sources */, - 4CA0CAC216CE86B90007A85D /* NSDictionary+DBInfo.m in Sources */, + 4CA0CAC216CE86B90007A85D /* CacheDBInfoStorage.m in Sources */, 4CA0CAC416CE86B90007A85D /* NSObject+CompositeKey.m in Sources */, 4CA0CAC616CE86B90007A85D /* NSString+CacheFSManager.m in Sources */, 4CA0CAC816CE86B90007A85D /* NSString+CompositeKey.m in Sources */, + 4C236BF918759C3F0027B50A /* CacheDBInfo.m in Sources */, 4C0D56E717E70F4A001F0944 /* JFFCacheLoadImageError.m in Sources */, - 4CA0CACA16CE86B90007A85D /* JFFBaseDB.m in Sources */, 4CA0CACE16CE86B90007A85D /* JFFCaches.m in Sources */, 4CA0CAD016CE86B90007A85D /* JFFDBCompositeKey.m in Sources */, 4CA0CAD216CE86B90007A85D /* JFFDBInfo.m in Sources */, - 4CA0CAD416CE86B90007A85D /* JFFDBManager.m in Sources */, + 4C236BFD1875B7870027B50A /* JFFKeyValueDB.m in Sources */, 4CA0CAD616CE86B90007A85D /* JFFThumbnailStorage.m in Sources */, 4CA0CADA16CE86F70007A85D /* JFFCacheNoURLError.m in Sources */, 4CB92AE616FA02E600471165 /* UIImageView+CachedAsyncImageLoader.m in Sources */, @@ -294,6 +294,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_MODULES = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; @@ -312,8 +313,9 @@ ../JFFRestKit, ., ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; @@ -323,6 +325,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_MODULES = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; COPY_PHASE_STRIP = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; @@ -334,7 +337,7 @@ ../JFFRestKit, ., ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -348,7 +351,6 @@ DSTROOT = /tmp/JFFCache.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JFFCache/JFFCache-Prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -362,7 +364,6 @@ DSTROOT = /tmp/JFFCache.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JFFCache/JFFCache-Prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; diff --git a/lib/JFFCache/JFFCache/Categories/UIImageView+CachedAsyncImageLoader.m b/lib/JFFCache/JFFCache/Categories/UIImageView+CachedAsyncImageLoader.m index 858e68e..436a087 100644 --- a/lib/JFFCache/JFFCache/Categories/UIImageView+CachedAsyncImageLoader.m +++ b/lib/JFFCache/JFFCache/Categories/UIImageView+CachedAsyncImageLoader.m @@ -44,7 +44,7 @@ - (void)setImageWithURL:(NSURL *)url andPlaceholder:(UIImage *)placeholder __weak UIImageView *weakSelf = self; - JFFDidFinishAsyncOperationHandler doneCallback = ^(UIImage *result, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallback = ^(UIImage *result, NSError *error) { [error writeErrorWithJFFLogger]; [weakSelf jffSetImage:result URL:url]; diff --git a/lib/JFFCache/JFFCache/JFFCache.h b/lib/JFFCache/JFFCache/JFFCache.h index 9584cfb..dc869bf 100644 --- a/lib/JFFCache/JFFCache/JFFCache.h +++ b/lib/JFFCache/JFFCache/JFFCache.h @@ -3,7 +3,6 @@ #import #import -#import #import //Errors diff --git a/lib/JFFCache/JFFCache/JFFCacheDB.h b/lib/JFFCache/JFFCache/JFFCacheDB.h index c28342a..521c3af 100644 --- a/lib/JFFCache/JFFCache/JFFCacheDB.h +++ b/lib/JFFCache/JFFCache/JFFCacheDB.h @@ -14,8 +14,4 @@ - (void)removeRecordsForKey:(id)key; - (void)removeAllRecordsWithCallback:(JFFSimpleBlock)callback; -- (void)migrateDB; - -- (NSNumber *)timeToLiveInHours; - @end diff --git a/lib/JFFCache/JFFCache/JFFCaches.h b/lib/JFFCache/JFFCache/JFFCaches.h index 7ba667d..03ba2ab 100644 --- a/lib/JFFCache/JFFCache/JFFCaches.h +++ b/lib/JFFCache/JFFCache/JFFCaches.h @@ -11,12 +11,16 @@ - (instancetype)initWithDBInfoDictionary:(NSDictionary *)cachesInfo; -+ (id< JFFCacheDB >)createCacheForName:(NSString *)name; ++ (id)createCacheForName:(NSString *)name; -- (id< JFFCacheDB >)cacheByName:(NSString *)name; +- (id)cacheByName:(NSString *)name; -- (id< JFFCacheDB >)thumbnailDB; ++ (NSString *)thumbnailDBName; -+ (id< JFFCacheDB >)createThumbnailDB; +- (id)thumbnailDB; + ++ (id)createThumbnailDB; + +- (void)migrateDBs; @end diff --git a/lib/JFFCache/JFFCache/JFFCaches.m b/lib/JFFCache/JFFCache/JFFCaches.m index a140fe1..bebb68f 100644 --- a/lib/JFFCache/JFFCache/JFFCaches.m +++ b/lib/JFFCache/JFFCache/JFFCaches.m @@ -1,10 +1,11 @@ #import "JFFCaches.h" #import "JFFCacheDB.h" -#import "JFFBaseDB.h" #import "JFFDBInfo.h" +#import "JFFKeyValueDB.h" -#import "NSDictionary+DBInfo.h" +#import "CacheDBInfo.h" +#import "CacheDBInfoStorage.h" #import @@ -13,45 +14,38 @@ static NSMutableDictionary *autoremoveSchedulersByCacheName; static NSString *const lockObject = @"41d318da-1229-4a50-9222-4ad870c56ecc"; -@interface JFFInternalCacheDB : JFFBaseDB +@interface JFFInternalCacheDB : JFFKeyValueDB -@property (nonatomic) NSString *configPropertyName; +@property (nonatomic) CacheDBInfo *cacheDBInfo; @end @implementation JFFInternalCacheDB -+ (void)removeOldDataWithAutoremoveProperties:(NSDictionary *)autoremoveProperties - dbPropertyName:(NSString *)dbPropertyName - dbInfo:(JFFDBInfo *)dbInfo +- (void)removeOldData { - NSTimeInterval removeRarelyAccessDataDelay = [autoremoveProperties autoRemoveByLastAccessDate]; - - JFFInternalCacheDB *cacheDB = [[self alloc] initWithCacheDBWithName:dbPropertyName - dbInfo:dbInfo]; + NSTimeInterval removeRarelyAccessDataDelay = _cacheDBInfo.autoRemoveByLastAccessDate; if (removeRarelyAccessDataDelay > 0.) { NSDate *fromDate = [[NSDate new] dateByAddingTimeInterval:-removeRarelyAccessDataDelay]; - [cacheDB removeRecordsToAccessDate:fromDate]; + [self removeRecordsToAccessDate:fromDate]; } - unsigned long long bytes = [autoremoveProperties autoRemoveByMaxSizeInMB] * 1024 * 1024; + unsigned long long bytes = _cacheDBInfo.autoRemoveByMaxSizeInMB * 1024 * 1024; if (bytes > 0) { - [cacheDB removeRecordsWhileTotalSizeMoreThenBytes:bytes]; + [self removeRecordsWhileTotalSizeMoreThenBytes:bytes]; } } -+ (void)runAutoremoveDataSchedulerWithName:(NSString *)dbPropertyName - autoremoveProperties:(NSDictionary *)autoremoveProperties - dbInfo:(JFFDBInfo *)dbInfo +- (void)runAutoRemoveDataSchedulerIfNeeds { @synchronized(lockObject) { - JFFTimer *timer = autoremoveSchedulersByCacheName[dbPropertyName]; + JFFTimer *timer = autoremoveSchedulersByCacheName[_cacheDBInfo.dbPropertyName]; if (timer) return; @@ -61,17 +55,14 @@ + (void)runAutoremoveDataSchedulerWithName:(NSString *)dbPropertyName if (!timer) { timer = [JFFTimer new]; - autoremoveSchedulersByCacheName[dbPropertyName] = timer; + autoremoveSchedulersByCacheName[_cacheDBInfo.dbPropertyName] = timer; } JFFScheduledBlock block = ^void(JFFCancelScheduledBlock cancel) { JFFSyncOperation loadDataBlock = ^id(NSError *__autoreleasing *outError) { - [self removeOldDataWithAutoremoveProperties:autoremoveProperties - dbPropertyName:dbPropertyName - dbInfo:dbInfo]; - + [self removeOldData]; return [NSNull new]; }; @@ -89,30 +80,12 @@ + (void)runAutoremoveDataSchedulerWithName:(NSString *)dbPropertyName } } -+ (void)runAutoremoveDataSchedulerIfNeedsWithName:(NSString *)dbPropertyName - dbInfo:(JFFDBInfo *)dbInfo -{ - NSDictionary *dbInfoDict = [dbInfo currentDbInfo]; - NSDictionary *autoremoveProperties = - [dbInfoDict autoRemoveProperiesForDBWithName:dbPropertyName]; - - if (autoremoveProperties) { - - [self runAutoremoveDataSchedulerWithName:dbPropertyName - autoremoveProperties:autoremoveProperties - dbInfo:dbInfo]; - } -} - -- (instancetype)initWithCacheDBWithName:(NSString *)dbPropertyName - dbInfo:(JFFDBInfo *)dbInfo +- (instancetype)initWithCacheDBInfo:(CacheDBInfo *)dbInfo { - NSString *filePath = [[dbInfo dbInfo] fileNameForDBWithName:dbPropertyName]; - - self = [super initWithCacheFileName:filePath]; + self = [super initWithCacheFileName:dbInfo.fileName]; if (self) { - _configPropertyName = dbPropertyName; + _cacheDBInfo = dbInfo; } return self; @@ -121,15 +94,15 @@ - (instancetype)initWithCacheDBWithName:(NSString *)dbPropertyName //JTODO check using of migrateDB method when multithreaded - (void)migrateDB { - NSDictionary *currentDbInfo = [[JFFDBInfo sharedDBInfo] currentDbInfo]; - if (!currentDbInfo) { + NSDictionary *currentDbInfo = [[JFFDBInfo sharedDBInfo] currentDbVersionsByName]; + NSNumber *currVersion = currentDbInfo[_cacheDBInfo.dbPropertyName]; + + if (!currVersion) { return; } - NSDictionary *dbInfo = [[JFFDBInfo sharedDBInfo] dbInfo]; - - NSInteger lastVersion = [dbInfo versionForDBWithName:_configPropertyName]; - NSInteger currentVersion = [currentDbInfo versionForDBWithName:_configPropertyName]; + NSInteger lastVersion = _cacheDBInfo.version; + NSInteger currentVersion = [currVersion unsignedIntegerValue]; if (lastVersion > currentVersion) { [self removeAllRecordsWithCallback:nil]; @@ -138,8 +111,8 @@ - (void)migrateDB - (NSNumber *)timeToLiveInHours { - NSDictionary *dbInfo = [[JFFDBInfo sharedDBInfo] currentDbInfo]; - NSNumber *result = [dbInfo timeToLiveInHoursForDBWithName:_configPropertyName]; + CacheDBInfoStorage *dbInfo = [[JFFDBInfo sharedDBInfo] dbInfoByNames]; + NSNumber *result = [[dbInfo infoByDBName:_cacheDBInfo.dbPropertyName] timeToLiveInHours]; return result; } @@ -162,9 +135,10 @@ @implementation JFFCaches id< JFFCacheDB > result = self.mutableCacheDbByName[dbPropertyName]; if (!result) { - result = [[self class] createCacheForName:dbPropertyName - dbInfo:dbInfo]; - self.mutableCacheDbByName[dbPropertyName] = result; + JFFInternalCacheDB *db = (JFFInternalCacheDB *)[[self class] createCacheForName:dbPropertyName]; + [db runAutoRemoveDataSchedulerIfNeeds]; + self.mutableCacheDbByName[dbPropertyName] = db; + result = db; } return result; @@ -172,7 +146,7 @@ @implementation JFFCaches - (void)setupCachesWithDBInfo:(JFFDBInfo *)dbInfo { - [dbInfo.dbInfo enumerateKeysAndObjectsUsingBlock:^(id dbName, id obj, BOOL *stop) { + [dbInfo.dbInfoByNames enumerateKeysAndObjectsUsingBlock:^(NSString *dbName, CacheDBInfo *obj, BOOL *stop) { [self registerAndCreateCacheDBWithName:dbName dbInfo:dbInfo]; }]; @@ -224,39 +198,41 @@ - (NSDictionary *)cacheDbByName return self.mutableCacheDbByName; } -- (id< JFFCacheDB >)cacheByName:(NSString *)name +- (id)cacheByName:(NSString *)name { return self.cacheDbByName[name]; } -- (id< JFFCacheDB >)thumbnailDB ++ (NSString *)thumbnailDBName { - return [self cacheByName:@"JFF_THUMBNAIL_DB"]; + return @"JFF_THUMBNAIL_DB"; } -+ (id< JFFCacheDB >)createCacheForName:(NSString *)name - dbInfo:(JFFDBInfo *)dbInfo +- (id)thumbnailDB { - id< JFFCacheDB > result = [[JFFInternalCacheDB alloc ] initWithCacheDBWithName:name - dbInfo:dbInfo]; - - [JFFInternalCacheDB runAutoremoveDataSchedulerIfNeedsWithName:name - dbInfo:dbInfo]; - - return result; + return [self cacheByName:[[self class] thumbnailDBName]]; } -+ (id< JFFCacheDB >)createCacheForName:(NSString *)name ++ (id)createCacheForName:(NSString *)name { JFFDBInfo *dbInfo = [JFFDBInfo sharedDBInfo]; - return [self createCacheForName:name - dbInfo:dbInfo]; + return [[JFFInternalCacheDB alloc] initWithCacheDBInfo:[dbInfo.dbInfoByNames infoByDBName:name]]; } -+ (id< JFFCacheDB >)createThumbnailDB ++ (id)createThumbnailDB { - return [self createCacheForName:@"JFF_THUMBNAIL_DB"]; + return [self createCacheForName:[[self class] thumbnailDBName]]; +} + +- (void)migrateDBs +{ + NSDictionary *cacheDbByName = [self cacheDbByName]; + [cacheDbByName enumerateKeysAndObjectsUsingBlock:^(id key, JFFInternalCacheDB *db, BOOL *stop) { + [db migrateDB]; + }]; + + [[JFFDBInfo sharedDBInfo] saveCurrentDBInfoVersions]; } @end diff --git a/lib/JFFCache/JFFCache/JFFDBInfo.h b/lib/JFFCache/JFFCache/JFFDBInfo.h index ba52a0f..fe9c41b 100644 --- a/lib/JFFCache/JFFCache/JFFDBInfo.h +++ b/lib/JFFCache/JFFCache/JFFDBInfo.h @@ -1,9 +1,11 @@ #import +@class CacheDBInfoStorage; + @interface JFFDBInfo : NSObject -@property (atomic, readonly) NSDictionary *dbInfo; -@property (atomic) NSDictionary *currentDbInfo; +@property (atomic, readonly) CacheDBInfoStorage *dbInfoByNames; +@property (atomic, readonly) NSDictionary *currentDbVersionsByName; - (instancetype)initWithInfoPath:(NSString *)infoPath; - (instancetype)initWithInfoDictionary:(NSDictionary *)infoDictionry; @@ -11,4 +13,6 @@ + (void)setSharedDBInfo:(JFFDBInfo *)dbInfo; + (JFFDBInfo *)sharedDBInfo; +- (void)saveCurrentDBInfoVersions; + @end diff --git a/lib/JFFCache/JFFCache/JFFDBInfo.m b/lib/JFFCache/JFFCache/JFFDBInfo.m index 6264561..fa3839e 100644 --- a/lib/JFFCache/JFFCache/JFFDBInfo.m +++ b/lib/JFFCache/JFFCache/JFFDBInfo.m @@ -1,6 +1,9 @@ #import "JFFDBInfo.h" -static JFFDBInfo* sharedInfo = nil; +#import "CacheDBInfo.h" +#import "CacheDBInfoStorage.h" + +static JFFDBInfo *sharedInfo = nil; @interface JFFDBInfo () @@ -10,8 +13,8 @@ @interface JFFDBInfo () @implementation JFFDBInfo { - NSDictionary *_currentDbInfo; - NSDictionary *_dbInfo; + NSDictionary *_currentDbVersionsByName; + CacheDBInfoStorage *_dbInfoByNames; } - (instancetype)initWithInfoPath:(NSString *)infoPath @@ -30,29 +33,30 @@ - (instancetype)initWithInfoDictionary:(NSDictionary *)infoDictionry self = [super init]; if (self) { - _currentDbInfo = infoDictionry; + _dbInfoByNames = [CacheDBInfoStorage newCacheDBInfoStorageWithPlistInfo:infoDictionry]; } return self; } -- (NSDictionary *)createDBInfo +- (CacheDBInfoStorage *)createDBInfo { - return _currentDbInfo?:[NSDictionary dictionaryWithContentsOfFile:_dbInfoPath]; + id info = [NSDictionary dictionaryWithContentsOfFile:_dbInfoPath]; + return [CacheDBInfoStorage newCacheDBInfoStorageWithPlistInfo:info]; } -- (NSDictionary *)dbInfo +- (CacheDBInfoStorage *)dbInfoByNames { - if (_dbInfo) - return _dbInfo; + if (_dbInfoByNames) + return _dbInfoByNames; @synchronized(self) { - if (_dbInfo) - return _dbInfo; + if (_dbInfoByNames) + return _dbInfoByNames; - _dbInfo = [self createDBInfo]; + _dbInfoByNames = [self createDBInfo]; } - return _dbInfo; + return _dbInfoByNames; } + (JFFDBInfo *)newDbInfo @@ -78,39 +82,48 @@ + (void)setSharedDBInfo:(JFFDBInfo *)dbInfo + (NSString *)currentDBInfoFilePath { - return [NSString documentsPathByAppendingPathComponent:@"JFFCurrentDBInfo.data"] ; + return [NSString documentsPathByAppendingPathComponent:@"JFFCurrentDBVersions.data"]; } -- (NSDictionary *)currentDbInfo +- (NSDictionary *)currentDbVersionsByName { - if (_currentDbInfo) - return _currentDbInfo; + if (_currentDbVersionsByName) + return _currentDbVersionsByName; @synchronized(self) { - if (_currentDbInfo) - return _currentDbInfo; + if (_currentDbVersionsByName) + return _currentDbVersionsByName; NSString *path = [[self class] currentDBInfoFilePath]; NSDictionary *currentDbInfo = [[NSDictionary alloc] initWithContentsOfFile:path]; - self.currentDbInfo = currentDbInfo?:@{}; + + if ([currentDbInfo count] > 0) + _currentDbVersionsByName = currentDbInfo; } - return _currentDbInfo; + return _currentDbVersionsByName; } -- (void)setCurrentDbInfo:(NSDictionary *)currentDbInfo +- (void)saveCurrentDBInfoVersions { - if (_currentDbInfo == currentDbInfo) - return; - @synchronized(self) { - if (_currentDbInfo == currentDbInfo) + + NSMutableDictionary *mutableCurrentVersions = [NSMutableDictionary new]; + + [self.dbInfoByNames enumerateKeysAndObjectsUsingBlock:^(NSString *key, CacheDBInfo *obj, BOOL *stop) { + + mutableCurrentVersions[key] = @(obj.version); + }]; + + NSDictionary *currentVersions = [mutableCurrentVersions copy]; + + if ([self.currentDbVersionsByName isEqual:currentVersions]) return; - _currentDbInfo = currentDbInfo?:@{}; + _currentDbVersionsByName = currentVersions; NSString *path = [[self class] currentDBInfoFilePath]; - [_currentDbInfo writeToFile:path atomically:YES]; + [currentVersions writeToFile:path atomically:YES]; [path addSkipBackupAttribute]; } } diff --git a/lib/JFFCache/JFFCache/JFFThumbnailStorage.m b/lib/JFFCache/JFFCache/JFFThumbnailStorage.m index f0b7a7b..6e65e8f 100644 --- a/lib/JFFCache/JFFCache/JFFThumbnailStorage.m +++ b/lib/JFFCache/JFFCache/JFFThumbnailStorage.m @@ -1,13 +1,17 @@ #import "JFFThumbnailStorage.h" -#import "JFFCacheDB.h" #import "JFFCaches.h" +#import "JFFDBInfo.h" +#import "JFFCacheDB.h" +#import "CacheDBInfo.h" +#import "CacheDBInfoStorage.h" #import "JFFCacheNoURLError.h" #import "JFFCacheLoadImageError.h" #import #import +#import static NSString *const cacheQueueName = @"com.embedded_sources.jffcache.thumbnail_storage.cache"; @@ -24,6 +28,8 @@ - (BOOL)isURLToImageData @interface JFFCanNotCreateImageError : JFFError +@property (nonatomic) id context; + @end @implementation JFFCanNotCreateImageError @@ -33,10 +39,30 @@ - (instancetype)init return [self initWithDescription:@"can not create image with given data"]; } +- (instancetype)copyWithZone:(NSZone *)zone +{ + JFFCanNotCreateImageError *copy = [super copyWithZone:zone]; + + if (copy) { + copy->_context = [_context copyWithZone:zone]; + } + + return copy; +} + - (void)writeErrorWithJFFLogger { } +- (NSString *)errorLogDescription +{ + return [[NSString alloc] initWithFormat:@"%@ : %@ context: %@", + [self class], + [self localizedDescription], + _context + ]; +} + @end //TODO try to use NSURLCache @@ -51,7 +77,9 @@ static JFFAsyncBinderForIdentifier imageDataToUIImageBinder() if (image) return asyncOperationWithResult(image); - return asyncOperationWithError([JFFCanNotCreateImageError new]); + JFFCanNotCreateImageError *error = [JFFCanNotCreateImageError new]; + error.context = url; + return asyncOperationWithError(error); }; // TODO: Test perfomance // return ^JFFAsyncOperation(NSData *imageData) { @@ -162,7 +190,9 @@ + (void)setSharedStorage:(JFFThumbnailStorage *)storage + (NSTimeInterval)cacheDataLifeTimeInSeconds { - NSNumber *timeToLiveInHours = [[JFFCaches createThumbnailDB] timeToLiveInHours]; + CacheDBInfoStorage *dbInfoByNames = [[JFFDBInfo sharedDBInfo] dbInfoByNames]; + CacheDBInfo *info = [dbInfoByNames infoByDBName:[JFFCaches thumbnailDBName]]; + NSNumber *timeToLiveInHours = info.timeToLiveInHours; NSParameterAssert(timeToLiveInHours); return [timeToLiveInHours doubleValue]*3600.; } @@ -187,7 +217,7 @@ + (JFFAsyncOperation)onThreadLoadUrl:(NSURL *)url - (JFFAsyncOperation)cachedInDBImageDataLoaderForUrl:(NSURL *)url ignoreFreshDataLoadFail:(BOOL)ignoreFreshDataLoadFail { - JFFSmartUrlDataLoaderFields *args = [JFFSmartUrlDataLoaderFields new]; + JFFSmartDataLoaderFields *args = [JFFSmartDataLoaderFields new]; args.loadDataIdentifier = url; args.cacheDataLifeTimeInSeconds = [[self class] cacheDataLifeTimeInSeconds]; args.doesNotIgnoreFreshDataLoadFail = ignoreFreshDataLoadFail; @@ -231,22 +261,22 @@ - (JFFAsyncOperation)thumbnailLoaderForUrl:(NSURL *)url return asyncOperationWithError([JFFCacheNoURLError new]); } - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { JFFAsyncOperation loader = [self cachedInDBImageDataLoaderForUrl:url ignoreFreshDataLoadFail:YES]; //TODO: also check the last update date here - JFFPropertyPath* propertyPath = [[JFFPropertyPath alloc] initWithName:NSStringFromSelector(@selector(imagesByUrl)) + JFFPropertyPath *propertyPath = [[JFFPropertyPath alloc] initWithName:NSStringFromSelector(@selector(imagesByUrl)) key:url]; loader = [self asyncOperationForPropertyWithPath:propertyPath asyncOperation:loader]; return loader(progressCallback, - cancelCallback, + stateCallback, doneCallback); }; } diff --git a/lib/JFFContacts/JFFContacts.xcodeproj/project.pbxproj b/lib/JFFContacts/JFFContacts.xcodeproj/project.pbxproj index c94a653..b55ebfc 100644 --- a/lib/JFFContacts/JFFContacts.xcodeproj/project.pbxproj +++ b/lib/JFFContacts/JFFContacts.xcodeproj/project.pbxproj @@ -274,7 +274,7 @@ CE29B7FF15F60083000A05B8 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0510; ORGANIZATIONNAME = EmbeddedSources; }; buildConfigurationList = CE29B80215F60083000A05B8 /* Build configuration list for PBXProject "JFFContacts" */; @@ -397,8 +397,9 @@ ../, ., ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; @@ -427,7 +428,7 @@ ../, ., ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -440,7 +441,6 @@ DSTROOT = /tmp/JFFContacts.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JFFContacts/JFFContacts-Prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -453,7 +453,6 @@ DSTROOT = /tmp/JFFContacts.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JFFContacts/JFFContacts-Prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; diff --git a/lib/JFFContacts/JFFContacts/Async/JFFAsyncContacts.m b/lib/JFFContacts/JFFContacts/Async/JFFAsyncContacts.m index 7b16804..14212c5 100644 --- a/lib/JFFContacts/JFFContacts/Async/JFFAsyncContacts.m +++ b/lib/JFFContacts/JFFContacts/Async/JFFAsyncContacts.m @@ -10,20 +10,20 @@ @interface JFFAsyncRequestAccessToContactsLoader : NSObject + @implementation JFFContactPhotoField + (instancetype)newContactFieldWithName:(NSString *)name diff --git a/lib/JFFContacts/JFFContacts/Details/JFFContactStringArrayField.m b/lib/JFFContacts/JFFContacts/Details/JFFContactStringArrayField.m index 17282a7..a8bfdf2 100644 --- a/lib/JFFContacts/JFFContacts/Details/JFFContactStringArrayField.m +++ b/lib/JFFContacts/JFFContacts/Details/JFFContactStringArrayField.m @@ -72,14 +72,14 @@ - (void)setPropertyFromValue:(id)value self.value = [self filteredValues:value]; CFErrorRef error = NULL; - ABMutableMultiValueRef values_ = createMutableMultiValueWithArray(self.value, _labels); + ABMutableMultiValueRef values = createMutableMultiValueWithArray(self.value, _labels); BOOL didSet = ABRecordSetValue(self.record, self.propertyID, - values_, + values, &error); if (!didSet) { NSLog( @"can not set %@", self.name ); } - if ( values_ ) - CFRelease( values_ ); + if (values) + CFRelease(values); } @end diff --git a/lib/JFFContacts/JFFContacts/Details/NSArray+kABMultiValue.m b/lib/JFFContacts/JFFContacts/Details/NSArray+kABMultiValue.m index 25a8c99..28642d3 100644 --- a/lib/JFFContacts/JFFContacts/Details/NSArray+kABMultiValue.m +++ b/lib/JFFContacts/JFFContacts/Details/NSArray+kABMultiValue.m @@ -5,17 +5,17 @@ @implementation NSArray (kABMultiValue) + (instancetype)arrayWithMultyValue:(ABMutableMultiValueRef)multyValue { CFIndex count = multyValue - ? ABMultiValueGetCount(multyValue) - : 0; + ?ABMultiValueGetCount(multyValue) + :0; if (0 == count) return nil; - + NSArray *result = [NSArray arrayWithCapacity:count ignoringNilsProducer:^id(NSUInteger index) { CFTypeRef value = ABMultiValueCopyValueAtIndex(multyValue, index); - + return (__bridge_transfer NSString *)value; }]; diff --git a/lib/JFFContacts/JFFContacts/JFFAddressBookFactory.mm b/lib/JFFContacts/JFFContacts/JFFAddressBookFactory.mm index e600693..bcf0db9 100755 --- a/lib/JFFContacts/JFFContacts/JFFAddressBookFactory.mm +++ b/lib/JFFContacts/JFFContacts/JFFAddressBookFactory.mm @@ -35,6 +35,7 @@ + (void)asyncAddressBookWithOnCreatedBlock:(JFFAddressBookOnCreated)callback return; } + CFRetain(result); JFFAddressBook *bookWrapper = [[JFFAddressBook alloc] initWithRawBook:result]; if (authorizationStatus != kABAuthorizationStatusNotDetermined) { @@ -58,6 +59,7 @@ + (void)asyncAddressBookWithOnCreatedBlock:(JFFAddressBookOnCreated)callback }; ABAddressBookRequestAccessWithCompletion(result, onAddressBookAccess); + CFRelease(result); } + (NSString *)bookStatusToString:(ABAuthorizationStatus)status diff --git a/lib/JFFContacts/JFFContacts/JFFContact.m b/lib/JFFContacts/JFFContacts/JFFContact.m index fca1ae1..372bb56 100644 --- a/lib/JFFContacts/JFFContacts/JFFContact.m +++ b/lib/JFFContacts/JFFContacts/JFFContact.m @@ -18,7 +18,7 @@ static ABRecordRef createOrGetContactPerson(ABRecordID contactInternalId, ABRecordRef result = ABAddressBookGetPersonWithRecordID(addressBook, contactInternalId); - + if (result) { CFRetain(result); return result; @@ -88,7 +88,7 @@ - (void)initializeDynamicFields { _fieldByName = [NSMutableDictionary new]; - NSDictionary* fieldNameByPropertyId_ = @{ + NSDictionary *fieldNameByPropertyId = @{ @(kABPersonFirstNameProperty) : JFFContactFirstName, @(kABPersonLastNameProperty) : JFFContactLastName , @(kABPersonOrganizationProperty) : JFFContactCompany , @@ -97,7 +97,7 @@ - (void)initializeDynamicFields ABRecordRef person = self.person; - [fieldNameByPropertyId_ enumerateKeysAndObjectsUsingBlock:^(NSNumber *propertyID, id fieldName, BOOL *stop) { + [fieldNameByPropertyId enumerateKeysAndObjectsUsingBlock:^(NSNumber *propertyID, id fieldName, BOOL *stop) { JFFContactStringField *field = [JFFContactStringField newContactFieldWithName:fieldName propertyID:(ABPropertyID)[propertyID longLongValue] diff --git a/lib/JFFContacts/JFFContacts/JFFContactFieldsKeys.h b/lib/JFFContacts/JFFContacts/JFFContactFieldsKeys.h index f5e3094..045bcda 100644 --- a/lib/JFFContacts/JFFContacts/JFFContactFieldsKeys.h +++ b/lib/JFFContacts/JFFContacts/JFFContactFieldsKeys.h @@ -1,18 +1,18 @@ #import -extern NSString* const JFFContactFirstName; -extern NSString* const JFFContactLastName ; -extern NSString* const JFFContactCompany ; -extern NSString* const JFFContactBirthday ; -extern NSString* const JFFContactPhoto ; -extern NSString* const JFFContactEmails ; -extern NSString* const JFFContactPhones ; -extern NSString* const JFFContactWebsites ; -extern NSString* const JFFContactAddresses; +extern NSString *const JFFContactFirstName; +extern NSString *const JFFContactLastName ; +extern NSString *const JFFContactCompany ; +extern NSString *const JFFContactBirthday ; +extern NSString *const JFFContactPhoto ; +extern NSString *const JFFContactEmails ; +extern NSString *const JFFContactPhones ; +extern NSString *const JFFContactWebsites ; +extern NSString *const JFFContactAddresses; //Address fields -extern NSString* JFFContactAddresseStreetKey (); -extern NSString* JFFContactAddresseCityKey (); -extern NSString* JFFContactAddresseStateKey (); -extern NSString* JFFContactAddresseZIPKey (); -extern NSString* JFFContactAddresseCountryKey(); +extern NSString *JFFContactAddresseStreetKey (); +extern NSString *JFFContactAddresseCityKey (); +extern NSString *JFFContactAddresseStateKey (); +extern NSString *JFFContactAddresseZIPKey (); +extern NSString *JFFContactAddresseCountryKey(); diff --git a/lib/JFFContacts/JFFContacts/JFFContactFieldsKeys.m b/lib/JFFContacts/JFFContacts/JFFContactFieldsKeys.m index 792a212..46bdfc8 100644 --- a/lib/JFFContacts/JFFContacts/JFFContactFieldsKeys.m +++ b/lib/JFFContacts/JFFContacts/JFFContactFieldsKeys.m @@ -12,27 +12,27 @@ NSString* const JFFContactWebsites = @"websites" ; NSString* const JFFContactAddresses = @"addresses"; -NSString* JFFContactAddresseStreetKey() +NSString *JFFContactAddresseStreetKey() { - return (__bridge NSString*)kABPersonAddressStreetKey; + return (__bridge NSString *)kABPersonAddressStreetKey; } -NSString* JFFContactAddresseCityKey() +NSString *JFFContactAddresseCityKey() { - return (__bridge NSString*)kABPersonAddressCityKey; + return (__bridge NSString *)kABPersonAddressCityKey; } -NSString* JFFContactAddresseStateKey() +NSString *JFFContactAddresseStateKey() { - return (__bridge NSString*)kABPersonAddressStateKey; + return (__bridge NSString *)kABPersonAddressStateKey; } -NSString* JFFContactAddresseZIPKey() +NSString *JFFContactAddresseZIPKey() { - return (__bridge NSString*)kABPersonAddressZIPKey; + return (__bridge NSString *)kABPersonAddressZIPKey; } -NSString* JFFContactAddresseCountryKey() +NSString *JFFContactAddresseCountryKey() { - return (__bridge NSString*)kABPersonAddressCountryKey; + return (__bridge NSString *)kABPersonAddressCountryKey; } diff --git a/lib/JFFCoreLocation/JFFCoreLocation.xcodeproj/project.pbxproj b/lib/JFFCoreLocation/JFFCoreLocation.xcodeproj/project.pbxproj index 84f4568..913ec5f 100644 --- a/lib/JFFCoreLocation/JFFCoreLocation.xcodeproj/project.pbxproj +++ b/lib/JFFCoreLocation/JFFCoreLocation.xcodeproj/project.pbxproj @@ -251,7 +251,8 @@ CE206DE716414CC2002476FD /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastTestingUpgradeCheck = 0510; + LastUpgradeCheck = 0510; ORGANIZATIONNAME = EmbeddedSources; }; buildConfigurationList = CE206DEA16414CC2002476FD /* Build configuration list for PBXProject "JFFCoreLocation" */; @@ -352,6 +353,7 @@ CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; COPY_PHASE_STRIP = NO; @@ -370,8 +372,9 @@ ../, ., ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; @@ -383,6 +386,7 @@ CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; COPY_PHASE_STRIP = YES; @@ -394,7 +398,7 @@ ../, ., ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -407,7 +411,6 @@ DSTROOT = /tmp/JFFCoreLocation.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JFFCoreLocation/JFFCoreLocation-Prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -420,7 +423,6 @@ DSTROOT = /tmp/JFFCoreLocation.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JFFCoreLocation/JFFCoreLocation-Prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; diff --git a/lib/JFFCoreLocation/JFFCoreLocation/asyncAdapters/JFFLocationLoader.m b/lib/JFFCoreLocation/JFFCoreLocation/asyncAdapters/JFFLocationLoader.m index afb10ba..d818386 100644 --- a/lib/JFFCoreLocation/JFFCoreLocation/asyncAdapters/JFFLocationLoader.m +++ b/lib/JFFCoreLocation/JFFCoreLocation/asyncAdapters/JFFLocationLoader.m @@ -20,7 +20,7 @@ @implementation JFFCoreLocationAsyncAdapter @private JFFLocationLoaderSupervisor *_supervisor; CLLocationAccuracy _accuracy; - JFFAsyncOperationInterfaceResultHandler _handler; + JFFDidFinishAsyncOperationCallback _finishCallback; JFFTimer *_timer; } @@ -41,12 +41,12 @@ + (instancetype)newCoreLocationAsyncAdapterWithAccuracy:(double)accuracyInMeters return [[self alloc] initWithAccuracy:accuracyInMeters]; } -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { - handler = [handler copy]; - _handler = handler; + finishCallback = [finishCallback copy]; + _finishCallback = finishCallback; _supervisor = [JFFLocationLoaderSupervisor sharedLocationLoaderSupervisorWithAccuracy:_accuracy]; @@ -63,7 +63,7 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorized) { - handler(nil, [JFFLocationServicesDisabledError new]); + finishCallback(nil, [JFFLocationServicesDisabledError new]); return; } @@ -73,16 +73,16 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler cancel(); - [weakSelf onSchedulerWithHandler:handler]; + [weakSelf onSchedulerWithHandler:finishCallback]; } duration:_tolerance]; } -- (void)onSchedulerWithHandler:(JFFAsyncOperationInterfaceResultHandler)handler +- (void)onSchedulerWithHandler:(JFFDidFinishAsyncOperationCallback)finishCallback { if (_supervisor.location) { [self forceProcessLocation:_supervisor.location]; } else { - handler(nil, [JFFUnableToGetLocationError new]); + finishCallback(nil, [JFFUnableToGetLocationError new]); } } @@ -92,9 +92,11 @@ - (void)stopObserving _supervisor = nil; } -- (void)cancel:(BOOL)canceled +- (void)doTask:(JFFAsyncOperationHandlerTask)task { - if (canceled) { + NSParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); + + if (task == JFFAsyncOperationHandlerTaskCancel) { [self stopObserving]; } } @@ -103,7 +105,7 @@ - (void)forceProcessLocation:(CLLocation *)location { NSParameterAssert(location); - _handler(location, nil); + _finishCallback(location, nil); } - (BOOL)processLocation:(CLLocation *)location diff --git a/lib/JFFCoreLocation/JFFCoreLocation/asyncAdapters/JFFPlacemarksLoader.m b/lib/JFFCoreLocation/JFFCoreLocation/asyncAdapters/JFFPlacemarksLoader.m index 0d35e5f..0883aa6 100644 --- a/lib/JFFCoreLocation/JFFCoreLocation/asyncAdapters/JFFPlacemarksLoader.m +++ b/lib/JFFCoreLocation/JFFCoreLocation/asyncAdapters/JFFPlacemarksLoader.m @@ -48,24 +48,25 @@ + (instancetype)newPlacemarksAsyncAdapterWithLocation:(CLLocation *)location return [[self alloc] initWithLocation:location]; } -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { - handler = [handler copy]; + finishCallback = [finishCallback copy]; _geocoder = [CLGeocoder new]; CLGeocodeCompletionHandler completionHandler = ^void(NSArray *placemarks, NSError *error) { - handler(placemarks, error); + finishCallback(placemarks, error); }; [_geocoder reverseGeocodeLocation:_location completionHandler:completionHandler]; } -- (void)cancel:(BOOL)canceled +- (void)doTask:(JFFAsyncOperationHandlerTask)task { - if (canceled) { + NSCParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); + if (task == JFFAsyncOperationHandlerTaskCancel) { [_geocoder cancelGeocode]; } } diff --git a/lib/JFFJpeg/JFFJpeg.xcodeproj/project.pbxproj b/lib/JFFJpeg/JFFJpeg.xcodeproj/project.pbxproj index 6c42c20..78b142c 100644 --- a/lib/JFFJpeg/JFFJpeg.xcodeproj/project.pbxproj +++ b/lib/JFFJpeg/JFFJpeg.xcodeproj/project.pbxproj @@ -272,7 +272,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -317,7 +316,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; diff --git a/lib/JFFJsonTools/JFFJsonTools.xcodeproj/project.pbxproj b/lib/JFFJsonTools/JFFJsonTools.xcodeproj/project.pbxproj index 7f9a6d2..d275e80 100644 --- a/lib/JFFJsonTools/JFFJsonTools.xcodeproj/project.pbxproj +++ b/lib/JFFJsonTools/JFFJsonTools.xcodeproj/project.pbxproj @@ -101,6 +101,13 @@ remoteGlobalIDString = 1BE0542A154826DA00270B58; remoteInfo = JFFTestTools; }; + 4C3C5BC018674D68000B235A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = CE532C7016036D9A0029920A /* JFFAsyncOperations.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 4C1A0F8D182577BE0020FBF6; + remoteInfo = JFFAsyncOperationsMacOS; + }; CE532C5416036D3E0029920A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = CE532C4A16036D3E0029920A /* JFFScheduler.xcodeproj */; @@ -355,6 +362,7 @@ CE532C7E16036D9A0029920A /* libJFFAsyncOperations.a */, CE532C8016036D9A0029920A /* libJFFAsyncOperations-clang.a */, CE532C8216036D9A0029920A /* JFFAsyncOperationsFW.framework */, + 4C3C5BC118674D68000B235A /* libJFFAsyncOperationsMacOS.a */, ); name = Products; sourceTree = ""; @@ -432,7 +440,7 @@ CE532C0016036CE40029920A /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0510; ORGANIZATIONNAME = EmbeddedSources; TargetAttributes = { 4C043A75181EA60D00246A88 = { @@ -519,6 +527,13 @@ remoteRef = 4C043AA9181EAB1E00246A88 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 4C3C5BC118674D68000B235A /* libJFFAsyncOperationsMacOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libJFFAsyncOperationsMacOS.a; + remoteRef = 4C3C5BC018674D68000B235A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; CE532C5516036D3E0029920A /* libJFFScheduler.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -709,7 +724,6 @@ "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_VERSION = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; @@ -719,8 +733,9 @@ ../, ., ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; + ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; }; @@ -740,7 +755,6 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; COPY_PHASE_STRIP = YES; - GCC_VERSION = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; @@ -750,7 +764,7 @@ ../, ., ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; @@ -764,7 +778,6 @@ DSTROOT = /tmp/JFFJsonTools.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JFFJsonTools/JFFJsonTools-Prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; @@ -776,7 +789,6 @@ DSTROOT = /tmp/JFFJsonTools.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JFFJsonTools/JFFJsonTools-Prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; diff --git a/lib/JFFJsonTools/JFFJsonTools/Details/JFFOptionalObjectFieldKey.m b/lib/JFFJsonTools/JFFJsonTools/Details/JFFOptionalObjectFieldKey.m index 58f0b3b..23f4946 100644 --- a/lib/JFFJsonTools/JFFJsonTools/Details/JFFOptionalObjectFieldKey.m +++ b/lib/JFFJsonTools/JFFJsonTools/Details/JFFOptionalObjectFieldKey.m @@ -38,4 +38,9 @@ - (NSUInteger)hash return [_fieldKey hash]; } +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"<%@: %p fieldKey: %@>", [self class], self, _fieldKey]; +} + @end diff --git a/lib/JFFJsonTools/JFFJsonTools/Details/JFFOptionalObjectFieldValue.m b/lib/JFFJsonTools/JFFJsonTools/Details/JFFOptionalObjectFieldValue.m index 847f5b3..391c068 100644 --- a/lib/JFFJsonTools/JFFJsonTools/Details/JFFOptionalObjectFieldValue.m +++ b/lib/JFFJsonTools/JFFJsonTools/Details/JFFOptionalObjectFieldValue.m @@ -13,4 +13,9 @@ + (instancetype)newOptionalObjectFieldWithFieldValue:(id)fieldValue return result; } +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"<%@: %p fieldValue: %@>", [self class], self, _fieldValue]; +} + @end diff --git a/lib/JFFJsonTools/JFFJsonTools/Details/NSObject+JFFJsonObjectValidator.m b/lib/JFFJsonTools/JFFJsonTools/Details/NSObject+JFFJsonObjectValidator.m index 7c1bbce..1b6b431 100644 --- a/lib/JFFJsonTools/JFFJsonTools/Details/NSObject+JFFJsonObjectValidator.m +++ b/lib/JFFJsonTools/JFFJsonTools/Details/NSObject+JFFJsonObjectValidator.m @@ -47,7 +47,9 @@ - (BOOL)validateWithJsonPatternClass:(id)jsonPattern SEL selector = isClass(self)?@selector(isSubclassOfClass:):@selector(isKindOfClass:); - if (!objc_msgSend(self, selector, checkClass)) { + typedef BOOL (*AlignMsgSendFunction)(id, SEL, id); + AlignMsgSendFunction alignFunction = (AlignMsgSendFunction)objc_msgSend; + if (!alignFunction(self, selector, checkClass)) { if (outError) { JFFJsonValidationError *error = [JFFJsonValidationError new]; error.jsonObject = rootJsonObject ; diff --git a/lib/JFFNetwork/ContentEncodings/JNGzipErrorsLogger.m b/lib/JFFNetwork/ContentEncodings/JNGzipErrorsLogger.m index ba87278..8d7b3f5 100755 --- a/lib/JFFNetwork/ContentEncodings/JNGzipErrorsLogger.m +++ b/lib/JFFNetwork/ContentEncodings/JNGzipErrorsLogger.m @@ -17,7 +17,7 @@ + (NSString *)zipErrorMessageFromCode:(int)errorCode NSUInteger errorIndex = errorCode + abs(Z_VERSION_ERROR); NSUInteger maxErrorIndex = Z_ERRNO + abs(Z_VERSION_ERROR); - if (errorIndex > maxErrorIndex) { + if (errorIndex > maxErrorIndex || errorIndex < 0) { return @"Z_UnknownError"; } diff --git a/lib/JFFNetwork/ContentEncodings/JNHttpEncodingsFactory.m b/lib/JFFNetwork/ContentEncodings/JNHttpEncodingsFactory.m index 3811b24..4ec471e 100755 --- a/lib/JFFNetwork/ContentEncodings/JNHttpEncodingsFactory.m +++ b/lib/JFFNetwork/ContentEncodings/JNHttpEncodingsFactory.m @@ -13,8 +13,11 @@ @implementation JNHttpEncodingsFactory - (instancetype)initWithContentLength:( unsigned long long )contentLength { - self = [ super init ]; - self.contentLength = contentLength; + self = [super init]; + + if (self) { + _contentLength = contentLength; + } return self; } diff --git a/lib/JFFNetwork/CookiesStorage/JFFLocalCookiesStorage.h b/lib/JFFNetwork/CookiesStorage/JFFLocalCookiesStorage.h index 3be947b..44cd72a 100644 --- a/lib/JFFNetwork/CookiesStorage/JFFLocalCookiesStorage.h +++ b/lib/JFFNetwork/CookiesStorage/JFFLocalCookiesStorage.h @@ -2,6 +2,8 @@ @interface JFFLocalCookiesStorage : NSObject +- (void)setMultipleCookies:(NSArray *)cookies; + - (void)setCookie:(NSHTTPCookie *)cookie; - (NSArray *)cookiesForURL:(NSURL *)url; diff --git a/lib/JFFNetwork/Detail/JFFNetworkAsyncOperation.m b/lib/JFFNetwork/Detail/JFFNetworkAsyncOperation.m index b43c5b8..2d6b0a7 100644 --- a/lib/JFFNetwork/Detail/JFFNetworkAsyncOperation.m +++ b/lib/JFFNetwork/Detail/JFFNetworkAsyncOperation.m @@ -11,12 +11,12 @@ @implementation JFFNetworkAsyncOperation -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { - NSParameterAssert(handler ); - NSParameterAssert(progress); + NSParameterAssert(finishCallback ); + NSParameterAssert(progressCallback); { JNConnectionsFactory *factory = @@ -30,7 +30,7 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler __unsafe_unretained JFFNetworkAsyncOperation *unretainedSelf = self; id connection = self.connection; - progress = [progress copy]; + progressCallback = [progressCallback copy]; _connection.didReceiveDataBlock = ^(NSData *dataChunk) { JFFNetworkResponseDataCallback *progressData = [JFFNetworkResponseDataCallback new]; @@ -40,7 +40,7 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler progressData.downloadedBytesCount = [connection downloadedBytesCount]; } - progress(progressData); + progressCallback(progressData); }; _connection.didUploadDataBlock = ^(NSNumber *progressNum) { @@ -48,24 +48,23 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler JFFNetworkUploadProgressCallback *uploadProgress = [JFFNetworkUploadProgressCallback new]; uploadProgress.progress = progressNum; uploadProgress.params = unretainedSelf.params; - progress(uploadProgress); + progressCallback(uploadProgress); }; __block id resultHolder; JFFNetworkErrorTransformer errorTransformer = _errorTransformer; - handler = [handler copy]; + finishCallback = [finishCallback copy]; JFFDidFinishLoadingHandler finish = [^(NSError *error) { if (error) { - handler(nil, errorTransformer?errorTransformer(error):error); + finishCallback(nil, errorTransformer?errorTransformer(error):error); return; } - handler(resultHolder, nil); - + finishCallback(resultHolder, nil); } copy]; finish = [finish copy]; @@ -92,11 +91,13 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler - (void)forceCancel { - [self cancel:YES]; + [self doTask:JFFAsyncOperationHandlerTaskCancel]; } -- (void)cancel:(BOOL)canceled +- (void)doTask:(JFFAsyncOperationHandlerTask)task { + NSCParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); + _connection.didReceiveDataBlock = nil; _connection.didFinishLoadingBlock = nil; _connection.didReceiveResponseBlock = nil; @@ -104,7 +105,7 @@ - (void)cancel:(BOOL)canceled _connection.shouldAcceptCertificateBlock = nil; //TODO maybe always cancel? - if (canceled) { + if (task == JFFAsyncOperationHandlerTaskCancel) { [_connection cancel]; _connection = nil; } diff --git a/lib/JFFNetwork/DownloadManager/JFFDownloadItem.m b/lib/JFFNetwork/DownloadManager/JFFDownloadItem.m index 6316229..36263da 100644 --- a/lib/JFFNetwork/DownloadManager/JFFDownloadItem.m +++ b/lib/JFFNetwork/DownloadManager/JFFDownloadItem.m @@ -13,7 +13,8 @@ #import #import -#import +#import +#import static JFFMutableAssignArray *downloadItems = nil; @@ -27,7 +28,7 @@ @interface JFFDownloadItem () @property (nonatomic) unsigned long long fileLength; @property (nonatomic) unsigned long long downloadedFileLength; @property (nonatomic) NSNull *downloadedFlag; -@property (nonatomic, copy) JFFCancelAsyncOperation stopBlock; +@property (nonatomic, copy) JFFAsyncOperationHandler stopBlock; @end @@ -36,7 +37,7 @@ @implementation JFFDownloadItem JFFTrafficCalculator *_trafficCalculator; FILE *_file; float _previousProgress; - JFFMulticastDelegate< JFFDownloadItemDelegate > *_multicastDelegate; + JFFMulticastDelegate *_multicastDelegate; } @dynamic downloadedFlag; @@ -78,10 +79,10 @@ - (instancetype)initWithURL:(NSURL *)url - (JFFTrafficCalculator *)trafficCalculator { - if (!_trafficCalculator) { - _trafficCalculator = [[JFFTrafficCalculator alloc] initWithDelegate:self]; - } - return _trafficCalculator; + if (!_trafficCalculator) { + _trafficCalculator = [[JFFTrafficCalculator alloc] initWithDelegate:self]; + } + return _trafficCalculator; } - (void)closeFile @@ -134,7 +135,7 @@ + (BOOL)checkNotAlreadyUsedLocalPath:(NSString *)localFilePath BOOL result = ![downloadItems any:^BOOL(id object) { JFFDownloadItem *item_ = object; return ![item_.url isEqual:url] - && [ item_.localFilePath isEqualToString:localFilePath]; + && [ item_.localFilePath isEqualToString:localFilePath]; }]; if (!result && outError) { @@ -156,7 +157,7 @@ + (instancetype)downloadItemWithURL:(NSURL *)url id result = [downloadItems firstMatch: ^BOOL(id object) { JFFDownloadItem *item = object; return [item.url isEqual:url] - && [item.localFilePath isEqualToString:localFilePath]; + && [item.localFilePath isEqualToString:localFilePath]; } ]; if (!result) { @@ -167,7 +168,7 @@ + (instancetype)downloadItemWithURL:(NSURL *)url } [downloadItems addObject:result]; } - + return result; } @@ -194,7 +195,7 @@ - (void)start - (void)stop { - JFFCancelAsyncOperation stopBlock = [self.stopBlock copy]; + JFFAsyncOperationHandler stopBlock = [self.stopBlock copy]; if (stopBlock) { self.stopBlock = nil; stopBlock(YES); @@ -257,20 +258,15 @@ - (void)didFinishLoadedWithError:(NSError *)error [self finalizeLoading]; } -- (void)didCancelWithFlag:(BOOL)canceled - cancelCallback:(JFFCancelAsyncOperationHandler)cancelCallback +- (void)cancel { - NSParameterAssert(canceled); [self finalizeLoading]; [_multicastDelegate didCancelLoadingOfDownloadItem:self]; - - if (cancelCallback) - cancelCallback(canceled); } - (void)didReceiveData:(NSData *)data - progressHandler:(JFFAsyncOperationProgressHandler)progressCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { if (!_trafficCalculator) [self.trafficCalculator startLoading]; @@ -301,9 +297,9 @@ - (void)didReceiveResponse:(JFFURLResponse *)response - (JFFAsyncOperation)fileLoader { - JFFAsyncOperation loader = ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) + JFFAsyncOperation loader = ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { NSString *range = [[NSString alloc] initWithFormat:@"bytes=%qu-", self.downloadedFileLength]; NSDictionary *headers = @{ @"Range" : range }; @@ -316,7 +312,7 @@ - (JFFAsyncOperation)fileLoader progressCallback = [ progressCallback copy ]; connection.didReceiveDataBlock = ^(NSData *data) { [self didReceiveData:data - progressHandler:progressCallback]; + progressCallback:progressCallback]; }; doneCallback = [doneCallback copy]; @@ -332,26 +328,27 @@ - (JFFAsyncOperation)fileLoader [self didReceiveResponse:response]; }; - JFFCancelAsyncOperationBlockHolder *cancelCallbackBlockHolder = [JFFCancelAsyncOperationBlockHolder new]; - cancelCallback = [cancelCallback copy]; - JFFCancelAsyncOperationHandler cancelCallbackWrapper = ^(BOOL canceled) - { - [self didCancelWithFlag:canceled cancelCallback:cancelCallback]; + JFFAsyncOperationHandlerBlockHolder *cancelCallbackBlockHolder = [JFFAsyncOperationHandlerBlockHolder new]; + JFFAsyncOperationHandler loaderHandlerWrapper = ^(JFFAsyncOperationHandlerTask task) { + + [self cancel]; + if (doneCallback) + doneCallback(nil, [JFFAsyncOpFinishedByCancellationError new]); }; - cancelCallbackBlockHolder.cancelBlock = cancelCallbackWrapper; + cancelCallbackBlockHolder.loaderHandler = loaderHandlerWrapper; [connection start]; [_multicastDelegate didProgressChangeForDownloadItem:self]; - self.stopBlock = ^void(BOOL canceled) - { - if (canceled) + self.stopBlock = ^void(JFFAsyncOperationHandlerTask task) { + + if (task == JFFAsyncOperationHandlerTaskCancel) [connection cancel]; else - NSCAssert(NO, @"pass canceled as YES only"); + NSCAssert(NO, @"pass task: JFFAsyncOperationHandlerTaskCancel only"); - cancelCallbackBlockHolder.onceCancelBlock(canceled); + [cancelCallbackBlockHolder performCancelBlockOnceWithArgument:JFFAsyncOperationHandlerTaskCancel]; }; return self.stopBlock; }; @@ -359,7 +356,7 @@ - (JFFAsyncOperation)fileLoader loader = [self asyncOperationForPropertyWithName:NSStringFromSelector(@selector(downloadedFlag)) asyncOperation:loader]; - JFFDidFinishAsyncOperationHandler didFinishOperation = ^void(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback didFinishOperation = ^void(id result, NSError *error) { [self notifyFinishWithError:error]; }; return asyncOperationWithFinishCallbackBlock(loader, diff --git a/lib/JFFNetwork/Errors/JHttpError.h b/lib/JFFNetwork/Errors/JHttpError.h index 4d7bf7f..b3b3e11 100644 --- a/lib/JFFNetwork/Errors/JHttpError.h +++ b/lib/JFFNetwork/Errors/JHttpError.h @@ -11,5 +11,6 @@ - (BOOL)isHttpNotChangedError; - (BOOL)isServiceUnavailableError; - (BOOL)isInternalServerError; +- (BOOL)isNotFoundError; @end diff --git a/lib/JFFNetwork/Errors/JHttpError.m b/lib/JFFNetwork/Errors/JHttpError.m index 890b8e7..6a6ebfc 100644 --- a/lib/JFFNetwork/Errors/JHttpError.m +++ b/lib/JFFNetwork/Errors/JHttpError.m @@ -65,4 +65,9 @@ - (BOOL)isInternalServerError return (self.code == 500); } +- (BOOL)isNotFoundError +{ + return (self.code == 404); +} + @end diff --git a/lib/JFFNetwork/JFFNetwork.xcodeproj/project.pbxproj b/lib/JFFNetwork/JFFNetwork.xcodeproj/project.pbxproj index 718f2fe..c784a72 100644 --- a/lib/JFFNetwork/JFFNetwork.xcodeproj/project.pbxproj +++ b/lib/JFFNetwork/JFFNetwork.xcodeproj/project.pbxproj @@ -15,6 +15,75 @@ 1B166C941546E5AD00475B6A /* JFFLocalCookiesStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B166C921546E5AD00475B6A /* JFFLocalCookiesStorage.m */; }; 1B166C981546E65C00475B6A /* NSString+RFC_2965.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B166C961546E65C00475B6A /* NSString+RFC_2965.h */; }; 1B166C991546E65C00475B6A /* NSString+RFC_2965.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B166C971546E65C00475B6A /* NSString+RFC_2965.m */; }; + 4C0694AF182D40A60099BB66 /* JHttpBodyBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C377B1C175BD8E100F1B993 /* JHttpBodyBuilder.m */; }; + 4C0694B0182D40A60099BB66 /* NSHTTPCookie+MatchesURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA098FF174A3BFB002BEA0F /* NSHTTPCookie+MatchesURL.m */; }; + 4C0694B1182D40A60099BB66 /* NSData+DataForHTTPPost.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA09903174A3C3F002BEA0F /* NSData+DataForHTTPPost.m */; }; + 4C0694B2182D40A60099BB66 /* NSURL+Cookies.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA09907174A3C64002BEA0F /* NSURL+Cookies.m */; }; + 4C0694B3182D40A60099BB66 /* NSMutableURLRequest+CreateRequestWithURLParams.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA09917174A3E24002BEA0F /* NSMutableURLRequest+CreateRequestWithURLParams.m */; }; + 4C0694B4182D40A60099BB66 /* NSDictionary+JHTTPHeaders.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0991B174A3E28002BEA0F /* NSDictionary+JHTTPHeaders.m */; }; + 4C0694B5182D40A60099BB66 /* JHttpBodyBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C377B1C175BD8E100F1B993 /* JHttpBodyBuilder.m */; }; + 4C0694B6182D40A60099BB66 /* NSHTTPCookie+MatchesURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA098FF174A3BFB002BEA0F /* NSHTTPCookie+MatchesURL.m */; }; + 4C0694B7182D40A60099BB66 /* NSData+DataForHTTPPost.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA09903174A3C3F002BEA0F /* NSData+DataForHTTPPost.m */; }; + 4C0694B8182D40A60099BB66 /* NSURL+Cookies.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA09907174A3C64002BEA0F /* NSURL+Cookies.m */; }; + 4C0694B9182D40A60099BB66 /* NSMutableURLRequest+CreateRequestWithURLParams.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA09917174A3E24002BEA0F /* NSMutableURLRequest+CreateRequestWithURLParams.m */; }; + 4C0694BA182D40A60099BB66 /* NSDictionary+JHTTPHeaders.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0991B174A3E28002BEA0F /* NSDictionary+JHTTPHeaders.m */; }; + 4C0694BB182D40A70099BB66 /* JHttpBodyBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C377B1C175BD8E100F1B993 /* JHttpBodyBuilder.m */; }; + 4C0694BC182D40A70099BB66 /* NSHTTPCookie+MatchesURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA098FF174A3BFB002BEA0F /* NSHTTPCookie+MatchesURL.m */; }; + 4C0694BD182D40A70099BB66 /* NSData+DataForHTTPPost.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA09903174A3C3F002BEA0F /* NSData+DataForHTTPPost.m */; }; + 4C0694BE182D40A70099BB66 /* NSURL+Cookies.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA09907174A3C64002BEA0F /* NSURL+Cookies.m */; }; + 4C0694BF182D40A70099BB66 /* NSMutableURLRequest+CreateRequestWithURLParams.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA09917174A3E24002BEA0F /* NSMutableURLRequest+CreateRequestWithURLParams.m */; }; + 4C0694C0182D40A70099BB66 /* NSDictionary+JHTTPHeaders.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0991B174A3E28002BEA0F /* NSDictionary+JHTTPHeaders.m */; }; + 4C0694C1182D40B10099BB66 /* JNConnectionMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBDBF117173BE4004D670D /* JNConnectionMock.m */; }; + 4C0694C2182D40B10099BB66 /* JNetworkError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C98FAC916E0ACE400B6EFD8 /* JNetworkError.m */; }; + 4C0694C3182D40B10099BB66 /* JStreamError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C98FAC516E0ACC500B6EFD8 /* JStreamError.m */; }; + 4C0694C4182D40B10099BB66 /* JHttpError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C98FACD16E0AE7500B6EFD8 /* JHttpError.m */; }; + 4C0694C5182D40B20099BB66 /* JNConnectionMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBDBF117173BE4004D670D /* JNConnectionMock.m */; }; + 4C0694C6182D40B20099BB66 /* JNetworkError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C98FAC916E0ACE400B6EFD8 /* JNetworkError.m */; }; + 4C0694C7182D40B20099BB66 /* JStreamError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C98FAC516E0ACC500B6EFD8 /* JStreamError.m */; }; + 4C0694C8182D40B20099BB66 /* JHttpError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C98FACD16E0AE7500B6EFD8 /* JHttpError.m */; }; + 4C0694C9182D40B30099BB66 /* JNConnectionMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBDBF117173BE4004D670D /* JNConnectionMock.m */; }; + 4C0694CA182D40B30099BB66 /* JNetworkError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C98FAC916E0ACE400B6EFD8 /* JNetworkError.m */; }; + 4C0694CB182D40B30099BB66 /* JStreamError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C98FAC516E0ACC500B6EFD8 /* JStreamError.m */; }; + 4C0694CC182D40B30099BB66 /* JHttpError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C98FACD16E0AE7500B6EFD8 /* JHttpError.m */; }; + 4C0694CD182D40BE0099BB66 /* JFFNetworkAsyncOperationCallback.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF162DE16760ECD00B0B6E4 /* JFFNetworkAsyncOperationCallback.m */; }; + 4C0694CE182D40BE0099BB66 /* JFFNetworkResponseDataCallback.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF162E216760EF100B0B6E4 /* JFFNetworkResponseDataCallback.m */; }; + 4C0694CF182D40BE0099BB66 /* JFFNetworkUploadProgressCallback.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF162E616760F1C00B0B6E4 /* JFFNetworkUploadProgressCallback.m */; }; + 4C0694D0182D40BE0099BB66 /* NSString+RFC_2965.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B166C971546E65C00475B6A /* NSString+RFC_2965.m */; }; + 4C0694D1182D40BE0099BB66 /* JFFLocalCookiesStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B166C921546E5AD00475B6A /* JFFLocalCookiesStorage.m */; }; + 4C0694D2182D40BE0099BB66 /* JFFNetworkAsyncOperationCallback.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF162DE16760ECD00B0B6E4 /* JFFNetworkAsyncOperationCallback.m */; }; + 4C0694D3182D40BE0099BB66 /* JFFNetworkResponseDataCallback.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF162E216760EF100B0B6E4 /* JFFNetworkResponseDataCallback.m */; }; + 4C0694D4182D40BE0099BB66 /* JFFNetworkUploadProgressCallback.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF162E616760F1C00B0B6E4 /* JFFNetworkUploadProgressCallback.m */; }; + 4C0694D5182D40BE0099BB66 /* NSString+RFC_2965.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B166C971546E65C00475B6A /* NSString+RFC_2965.m */; }; + 4C0694D6182D40BE0099BB66 /* JFFLocalCookiesStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B166C921546E5AD00475B6A /* JFFLocalCookiesStorage.m */; }; + 4C0694D7182D40BE0099BB66 /* JFFNetworkAsyncOperationCallback.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF162DE16760ECD00B0B6E4 /* JFFNetworkAsyncOperationCallback.m */; }; + 4C0694D8182D40BE0099BB66 /* JFFNetworkResponseDataCallback.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF162E216760EF100B0B6E4 /* JFFNetworkResponseDataCallback.m */; }; + 4C0694D9182D40BE0099BB66 /* JFFNetworkUploadProgressCallback.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF162E616760F1C00B0B6E4 /* JFFNetworkUploadProgressCallback.m */; }; + 4C0694DA182D40BE0099BB66 /* NSString+RFC_2965.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B166C971546E65C00475B6A /* NSString+RFC_2965.m */; }; + 4C0694DB182D40BE0099BB66 /* JFFLocalCookiesStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B166C921546E5AD00475B6A /* JFFLocalCookiesStorage.m */; }; + 4C0694DC182D40C90099BB66 /* NSString+XQueryComponents.m in Sources */ = {isa = PBXBuildFile; fileRef = 65F47AC91539A38000D8C865 /* NSString+XQueryComponents.m */; }; + 4C0694DD182D40C90099BB66 /* NSURL+XQueryComponents.m in Sources */ = {isa = PBXBuildFile; fileRef = 65F47ACE1539A3BE00D8C865 /* NSURL+XQueryComponents.m */; }; + 4C0694DE182D40C90099BB66 /* NSDictionary+XQueryComponents.m in Sources */ = {isa = PBXBuildFile; fileRef = 65F47AD21539A3FF00D8C865 /* NSDictionary+XQueryComponents.m */; }; + 4C0694DF182D40C90099BB66 /* NSString+XQueryComponents.m in Sources */ = {isa = PBXBuildFile; fileRef = 65F47AC91539A38000D8C865 /* NSString+XQueryComponents.m */; }; + 4C0694E0182D40C90099BB66 /* NSURL+XQueryComponents.m in Sources */ = {isa = PBXBuildFile; fileRef = 65F47ACE1539A3BE00D8C865 /* NSURL+XQueryComponents.m */; }; + 4C0694E1182D40C90099BB66 /* NSDictionary+XQueryComponents.m in Sources */ = {isa = PBXBuildFile; fileRef = 65F47AD21539A3FF00D8C865 /* NSDictionary+XQueryComponents.m */; }; + 4C0694E2182D40CA0099BB66 /* NSString+XQueryComponents.m in Sources */ = {isa = PBXBuildFile; fileRef = 65F47AC91539A38000D8C865 /* NSString+XQueryComponents.m */; }; + 4C0694E3182D40CA0099BB66 /* NSURL+XQueryComponents.m in Sources */ = {isa = PBXBuildFile; fileRef = 65F47ACE1539A3BE00D8C865 /* NSURL+XQueryComponents.m */; }; + 4C0694E4182D40CA0099BB66 /* NSDictionary+XQueryComponents.m in Sources */ = {isa = PBXBuildFile; fileRef = 65F47AD21539A3FF00D8C865 /* NSDictionary+XQueryComponents.m */; }; + 4C0694E5182D40E20099BB66 /* JFFNetworkAsyncOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B15CCB21535CAF4005F2B56 /* JFFNetworkAsyncOperation.m */; }; + 4C0694E6182D40E20099BB66 /* NSUrlLocationValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBDBE217173AF3004D670D /* NSUrlLocationValidator.m */; }; + 4C0694E7182D40E20099BB66 /* JFFNetworkAsyncOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B15CCB21535CAF4005F2B56 /* JFFNetworkAsyncOperation.m */; }; + 4C0694E8182D40E20099BB66 /* NSUrlLocationValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBDBE217173AF3004D670D /* NSUrlLocationValidator.m */; }; + 4C0694E9182D40E30099BB66 /* JFFNetworkAsyncOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B15CCB21535CAF4005F2B56 /* JFFNetworkAsyncOperation.m */; }; + 4C0694EA182D40E30099BB66 /* NSUrlLocationValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBDBE217173AF3004D670D /* NSUrlLocationValidator.m */; }; + 4C0694EB182D41000099BB66 /* JFFURLConnectionParams.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B15CCB71535CB39005F2B56 /* JFFURLConnectionParams.m */; }; + 4C0694EC182D41000099BB66 /* JFFURLConnectionParams.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B15CCB71535CB39005F2B56 /* JFFURLConnectionParams.m */; }; + 4C0694ED182D41010099BB66 /* JFFURLConnectionParams.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B15CCB71535CB39005F2B56 /* JFFURLConnectionParams.m */; }; + 4C069505182D412A0099BB66 /* JNSNetworkError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0B39216F0960300A20C25 /* JNSNetworkError.m */; }; + 4C069506182D412A0099BB66 /* JNSNoInternetNetworkError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0B39616F0965700A20C25 /* JNSNoInternetNetworkError.m */; }; + 4C069507182D412A0099BB66 /* JNSNetworkError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0B39216F0960300A20C25 /* JNSNetworkError.m */; }; + 4C069508182D412A0099BB66 /* JNSNoInternetNetworkError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0B39616F0965700A20C25 /* JNSNoInternetNetworkError.m */; }; + 4C069509182D412B0099BB66 /* JNSNetworkError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0B39216F0960300A20C25 /* JNSNetworkError.m */; }; + 4C06950A182D412B0099BB66 /* JNSNoInternetNetworkError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0B39616F0965700A20C25 /* JNSNoInternetNetworkError.m */; }; 4C377B1D175BD8E100F1B993 /* JHttpBodyBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C377B1B175BD8E000F1B993 /* JHttpBodyBuilder.h */; }; 4C377B1E175BD8E100F1B993 /* JHttpBodyBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C377B1C175BD8E100F1B993 /* JHttpBodyBuilder.m */; }; 4C98FAC616E0ACC500B6EFD8 /* JStreamError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C98FAC416E0ACC500B6EFD8 /* JStreamError.h */; }; @@ -961,7 +1030,7 @@ 8D5AE6D213F3E6C500EB6143 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0510; }; buildConfigurationList = 8D5AE6D513F3E6C500EB6143 /* Build configuration list for PBXProject "JFFNetwork" */; compatibilityVersion = "Xcode 3.2"; @@ -1067,25 +1136,48 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4C0694EC182D41000099BB66 /* JFFURLConnectionParams.m in Sources */, 5391037F14A88BCA007315A3 /* JFFURLConnection.m in Sources */, 5391038014A88BCA007315A3 /* JFFURLResponse.m in Sources */, 5391038114A88BCA007315A3 /* JFFNetworkBlocksFunctions.m in Sources */, 5391038214A88BCA007315A3 /* NSMutableSet+DownloadManager.m in Sources */, + 4C0694D6182D40BE0099BB66 /* JFFLocalCookiesStorage.m in Sources */, + 4C0694B8182D40A60099BB66 /* NSURL+Cookies.m in Sources */, + 4C0694E7182D40E20099BB66 /* JFFNetworkAsyncOperation.m in Sources */, 5391038314A88BCA007315A3 /* JFFFileManager.m in Sources */, 5391038414A88BCA007315A3 /* JFFTrafficCalculator.m in Sources */, + 4C0694C9182D40B30099BB66 /* JNConnectionMock.m in Sources */, + 4C0694CC182D40B30099BB66 /* JHttpError.m in Sources */, + 4C0694E1182D40C90099BB66 /* NSDictionary+XQueryComponents.m in Sources */, + 4C069507182D412A0099BB66 /* JNSNetworkError.m in Sources */, 5391038514A88BCA007315A3 /* JFFDownloadItem.m in Sources */, + 4C0694CB182D40B30099BB66 /* JStreamError.m in Sources */, + 4C0694B6182D40A60099BB66 /* NSHTTPCookie+MatchesURL.m in Sources */, 5391038614A88BCA007315A3 /* NSMutableDictionary+DownloadingFileInfo.m in Sources */, 5391038714A88BCA007315A3 /* JFFUrlResponseLogger.m in Sources */, 5391038814A88BCA007315A3 /* JNHttpEncodingsFactory.m in Sources */, 5391038914A88BCA007315A3 /* JNGzipDecoder.m in Sources */, + 4C069508182D412A0099BB66 /* JNSNoInternetNetworkError.m in Sources */, + 4C0694D5182D40BE0099BB66 /* NSString+RFC_2965.m in Sources */, + 4C0694D3182D40BE0099BB66 /* JFFNetworkResponseDataCallback.m in Sources */, + 4C0694DF182D40C90099BB66 /* NSString+XQueryComponents.m in Sources */, + 4C0694BA182D40A60099BB66 /* NSDictionary+JHTTPHeaders.m in Sources */, + 4C0694B9182D40A60099BB66 /* NSMutableURLRequest+CreateRequestWithURLParams.m in Sources */, + 4C0694E0182D40C90099BB66 /* NSURL+XQueryComponents.m in Sources */, + 4C0694E8182D40E20099BB66 /* NSUrlLocationValidator.m in Sources */, 5391038A14A88BCA007315A3 /* JNStubDecoder.m in Sources */, + 4C0694D4182D40BE0099BB66 /* JFFNetworkUploadProgressCallback.m in Sources */, 5391038B14A88BCA007315A3 /* JNZipDecoder.m in Sources */, 5391038C14A88BCA007315A3 /* JNGzipErrorsLogger.m in Sources */, 5391038D14A88BCA007315A3 /* JNNsUrlConnection.m in Sources */, 5391038E14A88BCA007315A3 /* JNAbstractConnection.m in Sources */, + 4C0694B5182D40A60099BB66 /* JHttpBodyBuilder.m in Sources */, 5391039014A88BCA007315A3 /* JNConnectionsFactory.m in Sources */, CE29B5E515F5E823000A05B8 /* NSURL+URLWithLocation.m in Sources */, + 4C0694B7182D40A60099BB66 /* NSData+DataForHTTPPost.m in Sources */, 7E54F3C215FA25C6006F386A /* JHttpFlagChecker.mm in Sources */, + 4C0694CA182D40B30099BB66 /* JNetworkError.m in Sources */, + 4C0694D2182D40BE0099BB66 /* JFFNetworkAsyncOperationCallback.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1093,25 +1185,48 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4C0694EB182D41000099BB66 /* JFFURLConnectionParams.m in Sources */, 65802B32148BFC2C0040A93A /* JFFUrlResponseLogger.m in Sources */, 65802B39148BFC4B0040A93A /* JFFURLResponse.m in Sources */, 65802B3C148BFC4B0040A93A /* JFFURLConnection.m in Sources */, 65802B3E148BFC4B0040A93A /* JNAbstractConnection.m in Sources */, + 4C0694D1182D40BE0099BB66 /* JFFLocalCookiesStorage.m in Sources */, + 4C0694B2182D40A60099BB66 /* NSURL+Cookies.m in Sources */, + 4C0694E5182D40E20099BB66 /* JFFNetworkAsyncOperation.m in Sources */, 65802B40148BFC4B0040A93A /* JNNsUrlConnection.m in Sources */, 65802B42148BFC4B0040A93A /* JFFNetworkBlocksFunctions.m in Sources */, + 4C0694C1182D40B10099BB66 /* JNConnectionMock.m in Sources */, + 4C0694C4182D40B10099BB66 /* JHttpError.m in Sources */, + 4C0694DE182D40C90099BB66 /* NSDictionary+XQueryComponents.m in Sources */, + 4C069505182D412A0099BB66 /* JNSNetworkError.m in Sources */, 65802B48148BFC6E0040A93A /* JFFDownloadItem.m in Sources */, + 4C0694C3182D40B10099BB66 /* JStreamError.m in Sources */, + 4C0694B0182D40A60099BB66 /* NSHTTPCookie+MatchesURL.m in Sources */, 65802B4B148BFC790040A93A /* JFFFileManager.m in Sources */, 65802B4D148BFC790040A93A /* NSMutableSet+DownloadManager.m in Sources */, 65802B4F148BFC790040A93A /* JFFTrafficCalculator.m in Sources */, 65802B52148BFC790040A93A /* NSMutableDictionary+DownloadingFileInfo.m in Sources */, + 4C069506182D412A0099BB66 /* JNSNoInternetNetworkError.m in Sources */, + 4C0694D0182D40BE0099BB66 /* NSString+RFC_2965.m in Sources */, + 4C0694CE182D40BE0099BB66 /* JFFNetworkResponseDataCallback.m in Sources */, + 4C0694DC182D40C90099BB66 /* NSString+XQueryComponents.m in Sources */, + 4C0694B4182D40A60099BB66 /* NSDictionary+JHTTPHeaders.m in Sources */, + 4C0694B3182D40A60099BB66 /* NSMutableURLRequest+CreateRequestWithURLParams.m in Sources */, + 4C0694DD182D40C90099BB66 /* NSURL+XQueryComponents.m in Sources */, + 4C0694E6182D40E20099BB66 /* NSUrlLocationValidator.m in Sources */, 65802B57148BFC8F0040A93A /* JNHttpEncodingsFactory.m in Sources */, + 4C0694CF182D40BE0099BB66 /* JFFNetworkUploadProgressCallback.m in Sources */, 65802B59148BFC8F0040A93A /* JNGzipDecoder.m in Sources */, 65802B5B148BFC8F0040A93A /* JNStubDecoder.m in Sources */, 65802B5D148BFC8F0040A93A /* JNZipDecoder.m in Sources */, 65802B60148BFC8F0040A93A /* JNGzipErrorsLogger.m in Sources */, + 4C0694AF182D40A60099BB66 /* JHttpBodyBuilder.m in Sources */, 65802B62148BFC930040A93A /* JNConnectionsFactory.m in Sources */, CE29B5E415F5E823000A05B8 /* NSURL+URLWithLocation.m in Sources */, + 4C0694B1182D40A60099BB66 /* NSData+DataForHTTPPost.m in Sources */, 7E54F3C115FA25C6006F386A /* JHttpFlagChecker.mm in Sources */, + 4C0694C2182D40B10099BB66 /* JNetworkError.m in Sources */, + 4C0694CD182D40BE0099BB66 /* JFFNetworkAsyncOperationCallback.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1119,25 +1234,48 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4C0694ED182D41010099BB66 /* JFFURLConnectionParams.m in Sources */, 7E8F205014F949A000588C7D /* JNConnectionsFactory.m in Sources */, 7E8F205314F949A000588C7D /* JNHttpEncodingsFactory.m in Sources */, 7E8F205514F949A000588C7D /* JNGzipDecoder.m in Sources */, 7E8F205714F949A000588C7D /* JNStubDecoder.m in Sources */, + 4C0694DB182D40BE0099BB66 /* JFFLocalCookiesStorage.m in Sources */, + 4C0694BE182D40A70099BB66 /* NSURL+Cookies.m in Sources */, + 4C0694E9182D40E30099BB66 /* JFFNetworkAsyncOperation.m in Sources */, 7E8F205914F949A000588C7D /* JNZipDecoder.m in Sources */, 7E8F205C14F949A000588C7D /* JNGzipErrorsLogger.m in Sources */, + 4C0694C5182D40B20099BB66 /* JNConnectionMock.m in Sources */, + 4C0694C8182D40B20099BB66 /* JHttpError.m in Sources */, + 4C0694E4182D40CA0099BB66 /* NSDictionary+XQueryComponents.m in Sources */, + 4C069509182D412B0099BB66 /* JNSNetworkError.m in Sources */, 7E8F206014F949A000588C7D /* JFFFileManager.m in Sources */, + 4C0694C7182D40B20099BB66 /* JStreamError.m in Sources */, + 4C0694BC182D40A70099BB66 /* NSHTTPCookie+MatchesURL.m in Sources */, 7E8F206214F949A000588C7D /* NSMutableSet+DownloadManager.m in Sources */, 7E8F206414F949A000588C7D /* JFFTrafficCalculator.m in Sources */, 7E8F206714F949A000588C7D /* NSMutableDictionary+DownloadingFileInfo.m in Sources */, 7E8F206914F949A000588C7D /* JFFDownloadItem.m in Sources */, + 4C06950A182D412B0099BB66 /* JNSNoInternetNetworkError.m in Sources */, + 4C0694DA182D40BE0099BB66 /* NSString+RFC_2965.m in Sources */, + 4C0694D8182D40BE0099BB66 /* JFFNetworkResponseDataCallback.m in Sources */, + 4C0694E2182D40CA0099BB66 /* NSString+XQueryComponents.m in Sources */, + 4C0694C0182D40A70099BB66 /* NSDictionary+JHTTPHeaders.m in Sources */, + 4C0694BF182D40A70099BB66 /* NSMutableURLRequest+CreateRequestWithURLParams.m in Sources */, + 4C0694E3182D40CA0099BB66 /* NSURL+XQueryComponents.m in Sources */, + 4C0694EA182D40E30099BB66 /* NSUrlLocationValidator.m in Sources */, 7E8F207114F949A000588C7D /* JFFURLResponse.m in Sources */, + 4C0694D9182D40BE0099BB66 /* JFFNetworkUploadProgressCallback.m in Sources */, 7E8F207414F949A000588C7D /* JFFURLConnection.m in Sources */, 7E8F207614F949A000588C7D /* JNAbstractConnection.m in Sources */, 7E8F207814F949A000588C7D /* JNNsUrlConnection.m in Sources */, 7E8F207A14F949A000588C7D /* JFFNetworkBlocksFunctions.m in Sources */, + 4C0694BB182D40A70099BB66 /* JHttpBodyBuilder.m in Sources */, 7E8F207C14F949A000588C7D /* JFFUrlResponseLogger.m in Sources */, CE29B5E615F5E824000A05B8 /* NSURL+URLWithLocation.m in Sources */, + 4C0694BD182D40A70099BB66 /* NSData+DataForHTTPPost.m in Sources */, 7E54F3C315FA25C6006F386A /* JHttpFlagChecker.mm in Sources */, + 4C0694C6182D40B20099BB66 /* JNetworkError.m in Sources */, + 4C0694D7182D40BE0099BB66 /* JFFNetworkAsyncOperationCallback.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1314,6 +1452,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; @@ -1343,6 +1482,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; COPY_PHASE_STRIP = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; diff --git a/lib/JFFNetwork/JFFNetworkBlocksFunctions.m b/lib/JFFNetwork/JFFNetworkBlocksFunctions.m index 3ba8c5a..7c6c19d 100644 --- a/lib/JFFNetwork/JFFNetworkBlocksFunctions.m +++ b/lib/JFFNetwork/JFFNetworkBlocksFunctions.m @@ -74,15 +74,15 @@ static JFFAsyncOperation privateGenericDataURLResponseLoader(JFFURLConnectionPar { NSCParameterAssert([params.url isKindOfClass:[NSURL class]]); params = [params copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { JFFAsyncOperation loader = privateGenericChunkedURLResponseLoader(params, responseAnalyzer); NSMutableData *responseData = [NSMutableData new]; progressCallback = [progressCallback copy]; - JFFAsyncOperationProgressHandler dataProgressCallback = ^void(id progressInfo) { + JFFAsyncOperationProgressCallback dataProgressCallback = ^void(id progressInfo) { if ([progressInfo isKindOfClass:[JFFNetworkResponseDataCallback class]]) { @@ -93,19 +93,31 @@ static JFFAsyncOperation privateGenericDataURLResponseLoader(JFFURLConnectionPar progressCallback(progressInfo); }; - JFFDidFinishAsyncOperationHandler doneCallbackWrapper; + /*NSArray *skipPt = @[@"profile/profileapi/changes", @"/info/api/report", @"/api/addDeviceProfileId"]; + + if ([skipPt all:^BOOL(id object) { + return ![[params.url description] containsString:object]; + }])*/ + //NSLog(@"start url: %@", params.url); + + JFFDidFinishAsyncOperationCallback doneCallbackWrapper; if (doneCallback) { doneCallback = [doneCallback copy]; doneCallbackWrapper = ^void(id result, NSError *error) { if ([responseData length] == 0 && !error) { - NSLog(@"!!!WARNING!!! request with params: %@ got an empty reponse", params); + NSLog(@"!!!WARNING!!! request with params: %@ got an empty response", params); } + /*if ([skipPt all:^BOOL(id object) { + return ![[params.url description] containsString:object]; + }]) + //NSLog(@"done url: %@ response: %@ \n \n", params.url, [responseData toString]);*/ + //NSLog(@"done url: %@", params.url); doneCallback(result?responseData:nil, error); }; } - return loader(dataProgressCallback, cancelCallback, doneCallbackWrapper); + return loader(dataProgressCallback, stateCallback, doneCallbackWrapper); }; } diff --git a/lib/JFFNetwork/JFFNetworkFW/JFFNetworkFW-Prefix.pch b/lib/JFFNetwork/JFFNetworkFW/JFFNetworkFW-Prefix.pch index 9f74cb1..90d718d 100644 --- a/lib/JFFNetwork/JFFNetworkFW/JFFNetworkFW-Prefix.pch +++ b/lib/JFFNetwork/JFFNetworkFW/JFFNetworkFW-Prefix.pch @@ -1,5 +1,4 @@ #ifdef __OBJC__ - #import #import #import diff --git a/lib/JFFNetwork/JFFNetworkMacOS/JFFNetworkMacOS-Prefix.pch b/lib/JFFNetwork/JFFNetworkMacOS/JFFNetworkMacOS-Prefix.pch index 25f2284..07a9af1 100644 --- a/lib/JFFNetwork/JFFNetworkMacOS/JFFNetworkMacOS-Prefix.pch +++ b/lib/JFFNetwork/JFFNetworkMacOS/JFFNetworkMacOS-Prefix.pch @@ -3,8 +3,8 @@ // #ifdef __OBJC__ - #import + #import #import - + #include #endif diff --git a/lib/JFFNetwork/JFFURLConnection.m b/lib/JFFNetwork/JFFURLConnection.m index 65e897c..39f4053 100644 --- a/lib/JFFNetwork/JFFURLConnection.m +++ b/lib/JFFNetwork/JFFURLConnection.m @@ -79,7 +79,7 @@ static void readStreamCallback(CFReadStreamRef stream, { [connectionContext.connection handleResponseForReadStream:stream]; - UInt8 buffer[kJNMaxBufferSize]; + UInt8 buffer[kJNMaxBufferSize] = {0}; CFIndex bytesRead = CFReadStreamRead(stream, buffer, kJNMaxBufferSize); if (bytesRead > 0) { @@ -97,14 +97,23 @@ static void readStreamCallback(CFReadStreamRef stream, [connectionContext.connection handleResponseForReadStream:stream]; CFStreamError error = CFReadStreamGetError(stream); - - JFFError *wrappedError = [[JStreamError alloc] initWithStreamError:error context:connectionContext.params]; + + + + + JStreamError *wrappedError = [[JStreamError alloc] initWithStreamError:error + context:connectionContext.params]; + + // @adk : wrap into dispatch_barrier_async() if crashes [connectionContext.connection handleFinish:wrappedError]; + break; } case kCFStreamEventEndEncountered: { [connectionContext.connection handleResponseForReadStream:stream]; + + // @adk : wrap into dispatch_barrier_async() if crashes [connectionContext.connection handleFinish:nil]; break; } @@ -116,14 +125,13 @@ @implementation JFFURLConnection CFReadStreamRef _readStream; id _cookiesStorage; BOOL _responseHandled; + JFFURLResponse *_urlResponse; - // NSString* _previousContentEncoding; unsigned long long _downloadedBytesCount; unsigned long long _totalBytesCount; dispatch_queue_t _queueForCallbacks; - __strong id _selfHolder; }; @@ -183,6 +191,8 @@ - (void)applyCookiesForHTTPRequest:(CFHTTPMessageRef)httpRequest - (void)startConnectionWithPostData:(NSData *)data headers:(NSDictionary *)headers { + // TODO : use "dependency injection" based design + // pass "queueForCallbacks" to the constructor NSParameterAssert([[NSThread currentThread] isMainThread]); _queueForCallbacks = dispatch_get_main_queue(); @@ -214,9 +224,9 @@ - (void)startConnectionWithPostData:(NSData *)data }]; [self closeReadStream]; - // CFReadStreamCreateForStreamedHTTPRequest( CFAllocatorRef alloc, - // CFHTTPMessageRef requestHeaders, - // CFReadStreamRef requestBody ) + + + _readStream = CFReadStreamCreateForHTTPRequest(NULL, httpRequest); CFRelease(httpRequest); @@ -248,7 +258,6 @@ - (void)startConnectionWithPostData:(NSData *)data Boolean openResult = CFReadStreamOpen(_readStream); if (!openResult) { - NSLog(@"Error opening a socket"); } } @@ -274,6 +283,8 @@ - (void)closeReadStream CFReadStreamUnscheduleFromRunLoop(_readStream, streamRunLoop, kCFRunLoopCommonModes); + + // @adk : wrap into @synchronized if crashes. Double check NULL. CFReadStreamClose(_readStream); CFRelease(_readStream); _readStream = nil; @@ -365,11 +376,14 @@ - (void)handleFinish:(NSError *)error __weak JFFURLConnection *weakSelf = self; dispatch_queue_t queueForCallbacks = _queueForCallbacks; - + +// wait until all unzip operations are completed dispatch_barrier_async(_zipQueue, ^void(void) { +// and notify callbacks on a proper queue dispatch_sync(queueForCallbacks, ^void(void) { +// @adk : maybe dispatch_async() is a better fit? JFFDidFinishLoadingHandler didFinishLoadingBlock = weakSelf.didFinishLoadingBlock; [weakSelf cancel]; @@ -397,18 +411,19 @@ - (void)handleResponseForReadStream:(CFReadStreamRef)stream return; } - NSDictionary* allHeadersDict; - CFIndex statusCode; + NSDictionary *allHeadersDict; + CFIndex statusCode = 0; { CFHTTPMessageRef response = (CFHTTPMessageRef)CFReadStreamCopyProperty(stream, kCFStreamPropertyHTTPResponseHeader); - if (!response) + if (NULL == response) return; allHeadersDict = (__bridge_transfer NSDictionary *)CFHTTPMessageCopyAllHeaderFields(response); statusCode = CFHTTPMessageGetResponseStatusCode(response); + NSParameterAssert(NULL != response); CFRelease(response); } @@ -422,7 +437,6 @@ - (void)handleResponseForReadStream:(CFReadStreamRef)stream #ifdef USE_DD_URL_BUILDER if (![ NSUrlLocationValidator isValidLocation:location]) { - NSLog(@"[!!!WARNING!!!] JConnection : path for URL is invalid. Ignoring..."); location = @"/"; } @@ -438,16 +452,14 @@ - (void)handleResponseForReadStream:(CFReadStreamRef)stream _context.params.httpBody = nil; #else if ([location hasPrefix:@"/"]) { - _context.params.url = [_context.params.url URLWithLocation:location]; } else { - _context.params.url = [location toURL]; } if (!_context.params.url) { _context.params.url = [_context.params.url URLWithLocation:@"/"]; - } + } _context.params.httpMethod = @"GET"; _context.params.httpBody = nil; @@ -457,11 +469,8 @@ - (void)handleResponseForReadStream:(CFReadStreamRef)stream NSDebugLog(@"Done."); [self start];//TODO start it later - } - else - { + } else { _responseHandled = YES; - JFFDidReceiveResponseHandler didReceiveResponseBlock = self.didReceiveResponseBlock; self.didReceiveResponseBlock = nil; diff --git a/lib/JFFNetwork/JFFURLConnectionParams.h b/lib/JFFNetwork/JFFURLConnectionParams.h index 4b6d6b9..310316b 100644 --- a/lib/JFFNetwork/JFFURLConnectionParams.h +++ b/lib/JFFNetwork/JFFURLConnectionParams.h @@ -6,7 +6,7 @@ typedef NSInputStream *(^JFFInputStreamBuilder)(void); @class JFFLocalCookiesStorage; -@interface JFFURLConnectionParams : NSObject +@interface JFFURLConnectionParams : NSObject @property (nonatomic) NSURL *url; @property (nonatomic) NSData *httpBody; diff --git a/lib/JFFNetwork/JHttpFlagChecker.mm b/lib/JFFNetwork/JHttpFlagChecker.mm index 76a0cfa..2f6dfe1 100644 --- a/lib/JFFNetwork/JHttpFlagChecker.mm +++ b/lib/JFFNetwork/JHttpFlagChecker.mm @@ -4,19 +4,19 @@ @implementation JHttpFlagChecker -+ (BOOL)isDownloadErrorFlag:( CFIndex )statusCode ++ (BOOL)isDownloadErrorFlag:(CFIndex)statusCode { BOOL result = ![self isSuccessFlag :statusCode] && ![self isRedirectFlag:statusCode]; - + return result; } + (BOOL)isRedirectFlag:(CFIndex)statusCode { - std::set redirectFlags; - { + static std::set redirectFlags; + if (redirectFlags.size() == 0) { redirectFlags.insert(301); redirectFlags.insert(302); redirectFlags.insert(303); @@ -24,8 +24,8 @@ + (BOOL)isRedirectFlag:(CFIndex)statusCode }; auto iFlag = redirectFlags.find(statusCode); - BOOL result_ = (redirectFlags.end() != iFlag); - return result_; + BOOL result = (redirectFlags.end() != iFlag); + return result; } + (BOOL)isSuccessFlag:(CFIndex)statusCode diff --git a/lib/JFFNetwork/JNNsUrlConnection.m b/lib/JFFNetwork/JNNsUrlConnection.m index e511f71..ee20b75 100644 --- a/lib/JFFNetwork/JNNsUrlConnection.m +++ b/lib/JFFNetwork/JNNsUrlConnection.m @@ -52,7 +52,7 @@ - (instancetype)initWithURLConnectionParams:(JFFURLConnectionParams *)params NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; if (runLoop != [NSRunLoop mainRunLoop]) { _connectRunLoop = runLoop; - [nativeConnection scheduleInRunLoop:runLoop forMode: NSDefaultRunLoopMode]; + [nativeConnection scheduleInRunLoop:runLoop forMode:NSDefaultRunLoopMode]; } _nativeConnection = nativeConnection; @@ -68,9 +68,9 @@ - (void)processLocalFileWithPath:(NSString *)path NSError *error; //STODO read file in separate thread //STODO read big files by chunks - NSData *data_ = [[NSData alloc]initWithContentsOfFile:path - options:0 - error:&error]; + NSData *data = [[NSData alloc]initWithContentsOfFile:path + options:0 + error:&error]; if (error) { [self connection:_nativeConnection @@ -85,7 +85,7 @@ - (void)processLocalFileWithPath:(NSString *)path didReceiveResponse:response]; [self connection:_nativeConnection - didReceiveData:data_]; + didReceiveData:data]; [self connectionDidFinishLoading:_nativeConnection]; } @@ -97,9 +97,9 @@ - (void)processLocalFileWithPath:(NSString *)path - (void)start { #ifdef NSURLConnectionDoesNotWorkWithLocalFiles - if ( [ _params.url isFileURL ] ) { - NSString* path_ = [ _params.url path ]; - [ self processLocalFileWithPath: path_ ]; + if ([_params.url isFileURL]) { + NSString *path = [_params.url path]; + [self processLocalFileWithPath:path]; return; } #endif @@ -123,7 +123,7 @@ - (void)clearCallbacks if (_connectRunLoop) { [_nativeConnection unscheduleFromRunLoop:_connectRunLoop - forMode:NSDefaultRunLoopMode]; + forMode:NSDefaultRunLoopMode]; } } diff --git a/lib/JFFRestKit/JFFRestKit.xcodeproj/project.pbxproj b/lib/JFFRestKit/JFFRestKit.xcodeproj/project.pbxproj index ba6c4a7..de7d071 100644 --- a/lib/JFFRestKit/JFFRestKit.xcodeproj/project.pbxproj +++ b/lib/JFFRestKit/JFFRestKit.xcodeproj/project.pbxproj @@ -15,8 +15,8 @@ 4C043A4F181E9D8300246A88 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C043A4E181E9D8300246A88 /* UIKit.framework */; }; 4C043A55181E9D8300246A88 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4C043A53181E9D8300246A88 /* InfoPlist.strings */; }; 4C043A57181E9D8300246A88 /* JFFRestKitTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C043A56181E9D8300246A88 /* JFFRestKitTests.m */; }; - 65A0BD6A15301D890007A3B5 /* JFFSmartUrlDataLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 65A0BD6815301D890007A3B5 /* JFFSmartUrlDataLoader.h */; }; - 65A0BD6B15301D890007A3B5 /* JFFSmartUrlDataLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 65A0BD6915301D890007A3B5 /* JFFSmartUrlDataLoader.m */; }; + 65A0BD6A15301D890007A3B5 /* JFFSmartDataLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 65A0BD6815301D890007A3B5 /* JFFSmartDataLoader.h */; }; + 65A0BD6B15301D890007A3B5 /* JFFSmartDataLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 65A0BD6915301D890007A3B5 /* JFFSmartDataLoader.m */; }; 65E307BC1531E9B200E0B781 /* JFFRestKitError.h in Headers */ = {isa = PBXBuildFile; fileRef = 65E307BA1531E9B200E0B781 /* JFFRestKitError.h */; }; 65E307BD1531E9B200E0B781 /* JFFRestKitError.m in Sources */ = {isa = PBXBuildFile; fileRef = 65E307BB1531E9B200E0B781 /* JFFRestKitError.m */; }; CE19F62716AED02D005B15B4 /* JFFCacheAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = CE19F62516AED02D005B15B4 /* JFFCacheAdapter.h */; }; @@ -49,8 +49,8 @@ 4C043A54181E9D8300246A88 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 4C043A56181E9D8300246A88 /* JFFRestKitTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JFFRestKitTests.m; sourceTree = ""; }; 4C043A58181E9D8300246A88 /* JFFRestKitTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "JFFRestKitTests-Prefix.pch"; sourceTree = ""; }; - 65A0BD6815301D890007A3B5 /* JFFSmartUrlDataLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFSmartUrlDataLoader.h; sourceTree = ""; }; - 65A0BD6915301D890007A3B5 /* JFFSmartUrlDataLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFSmartUrlDataLoader.m; sourceTree = ""; }; + 65A0BD6815301D890007A3B5 /* JFFSmartDataLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFSmartDataLoader.h; sourceTree = ""; }; + 65A0BD6915301D890007A3B5 /* JFFSmartDataLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFSmartDataLoader.m; sourceTree = ""; }; 65E307BA1531E9B200E0B781 /* JFFRestKitError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFRestKitError.h; sourceTree = ""; }; 65E307BB1531E9B200E0B781 /* JFFRestKitError.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFRestKitError.m; sourceTree = ""; }; 65E307BE1531EC3B00E0B781 /* JFFRestKitCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JFFRestKitCache.h; sourceTree = ""; }; @@ -119,8 +119,8 @@ 65E307BE1531EC3B00E0B781 /* JFFRestKitCache.h */, 65E307BA1531E9B200E0B781 /* JFFRestKitError.h */, 65E307BB1531E9B200E0B781 /* JFFRestKitError.m */, - 65A0BD6815301D890007A3B5 /* JFFSmartUrlDataLoader.h */, - 65A0BD6915301D890007A3B5 /* JFFSmartUrlDataLoader.m */, + 65A0BD6815301D890007A3B5 /* JFFSmartDataLoader.h */, + 65A0BD6915301D890007A3B5 /* JFFSmartDataLoader.m */, 1B32850C153FFDD000BE99CC /* JFFDataLoadersTools.h */, 1B32850D153FFDD000BE99CC /* JFFDataLoadersTools.m */, 1B7ABA89152D973A005DD4CA /* JFFRestKit.h */, @@ -181,7 +181,7 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 65A0BD6A15301D890007A3B5 /* JFFSmartUrlDataLoader.h in Headers */, + 65A0BD6A15301D890007A3B5 /* JFFSmartDataLoader.h in Headers */, 65E307BC1531E9B200E0B781 /* JFFRestKitError.h in Headers */, 1B32850E153FFDD000BE99CC /* JFFDataLoadersTools.h in Headers */, CE19F62716AED02D005B15B4 /* JFFCacheAdapter.h in Headers */, @@ -233,7 +233,7 @@ 1B7ABA78152D9739005DD4CA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0510; TargetAttributes = { 4C043A49181E9D8200246A88 = { TestTargetID = 1B7ABA80152D973A005DD4CA; @@ -274,7 +274,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 65A0BD6B15301D890007A3B5 /* JFFSmartUrlDataLoader.m in Sources */, + 65A0BD6B15301D890007A3B5 /* JFFSmartDataLoader.m in Sources */, 65E307BD1531E9B200E0B781 /* JFFRestKitError.m in Sources */, 1B32850F153FFDD000BE99CC /* JFFDataLoadersTools.m in Sources */, CE19F62816AED02D005B15B4 /* JFFCacheAdapter.m in Sources */, @@ -318,6 +318,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; @@ -339,8 +340,9 @@ ../TouchXmlHelper, ../JFFCache, ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; @@ -351,6 +353,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; COPY_PHASE_STRIP = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; @@ -365,7 +368,7 @@ ../TouchXmlHelper, ../JFFCache, ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -378,7 +381,6 @@ DSTROOT = /tmp/JFFRestKit.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JFFRestKit/JFFRestKit-Prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -391,7 +393,6 @@ DSTROOT = /tmp/JFFRestKit.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JFFRestKit/JFFRestKit-Prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -401,7 +402,6 @@ 4C043A5B181E9D8300246A88 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_WARN_BOOL_CONVERSION = YES; @@ -438,7 +438,6 @@ 4C043A5C181E9D8300246A88 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_WARN_BOOL_CONVERSION = YES; @@ -496,6 +495,7 @@ 4C043A5C181E9D8300246A88 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/lib/JFFRestKit/JFFRestKit/JFFDataLoadersTools.m b/lib/JFFRestKit/JFFRestKit/JFFDataLoadersTools.m index ea5ae79..e6703a8 100755 --- a/lib/JFFRestKit/JFFRestKit/JFFDataLoadersTools.m +++ b/lib/JFFRestKit/JFFRestKit/JFFDataLoadersTools.m @@ -24,44 +24,20 @@ JFFAsyncOperation jTmpFileLoaderWithChunkedDataLoader(JFFAsyncOperation chunkedD { chunkedDataLoader = [chunkedDataLoader copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { NSString *fileName = [[NSUUID new] UUIDString]; NSString *filePath = [NSString cachesPathByAppendingPathComponent:fileName]; __block NSFileHandle *handle = nil; __block volatile BOOL canceled = NO; - //TODO work with file with dispatch_io_create + //TODO work with file with dispatch_io_create !!! //https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html#//apple_ref/c/func/dispatch_io_create - void (^closeFile)(void) = ^(void) { - - [handle closeFile]; - handle = nil; - }; - - __block void (^closeAndRemoveFile)(void) = ^(void) { - - canceled = YES; - - dispatch_queue_t fileQueue = queueForFileAtPath(fileName); - - dispatch_barrier_async(fileQueue, ^(void) { - - closeFile(); - - if (filePath) - [[NSFileManager defaultManager] removeItemAtPath:filePath - error:nil]; - - disposeQueueForFileAtPath(fileName); - }); - }; - progressCallback = [progressCallback copy]; - JFFAsyncOperationProgressHandler progressWrapperCallback = ^(NSData *dataChunk) { + JFFAsyncOperationProgressCallback progressWrapperCallback = ^(NSData *dataChunk) { NSCParameterAssert([dataChunk isKindOfClass:[NSData class]]); @@ -97,24 +73,31 @@ __block void (^closeAndRemoveFile)(void) = ^(void) { progressCallback(dataChunk); }; - cancelCallback = [cancelCallback copy]; - JFFCancelAsyncOperationHandler cancelWrapperCallback = ^(BOOL canceled) { - closeAndRemoveFile(); + stateCallback = [stateCallback copy]; + JFFAsyncOperationChangeStateCallback cancelWrapperCallback = ^(JFFAsyncOperationState state) { - if (cancelCallback) - cancelCallback(canceled); + if (stateCallback) + stateCallback(state); }; - JFFDidFinishAsyncOperationHandler doneWrapperCallback = ^(id response, NSError *error) { + JFFDidFinishAsyncOperationCallback doneWrapperCallback = ^(id response, NSError *error) { id result = response?filePath:nil; - if (response) { + canceled = [error isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]]; + + if (response || canceled) { dispatch_queue_t writerQueue = queueForFileAtPath(fileName); dispatch_barrier_sync(writerQueue, ^(void) { - closeFile(); + [handle closeFile]; + handle = nil; + + if (filePath && canceled) + [[NSFileManager defaultManager] removeItemAtPath:filePath + error:nil]; + disposeQueueForFileAtPath(fileName); }); } diff --git a/lib/JFFRestKit/JFFRestKit/JFFRestKit.h b/lib/JFFRestKit/JFFRestKit/JFFRestKit.h index 3031d14..bc27bb5 100755 --- a/lib/JFFRestKit/JFFRestKit/JFFRestKit.h +++ b/lib/JFFRestKit/JFFRestKit/JFFRestKit.h @@ -1,7 +1,7 @@ -#import -#import #import #import +#import +#import #import diff --git a/lib/JFFRestKit/JFFRestKit/JFFSmartUrlDataLoader.m b/lib/JFFRestKit/JFFRestKit/JFFSmartUrlDataLoader.m index b08dd2a..78007b4 100644 --- a/lib/JFFRestKit/JFFRestKit/JFFSmartUrlDataLoader.m +++ b/lib/JFFRestKit/JFFRestKit/JFFSmartUrlDataLoader.m @@ -66,7 +66,7 @@ static JFFAsyncOperationBinder dataLoaderWithCachedResultBinder(BOOL doesNotIgno JFFDidFinishAsyncOperationHook finishCallbackHook = ^(NSData* srvResponse, NSError* error, - JFFDidFinishAsyncOperationHandler doneCallback) { + JFFDidFinishAsyncOperationCallback doneCallback) { if (!doneCallback) return; @@ -147,9 +147,9 @@ JFFAsyncOperation jSmartDataLoaderWithCache(JFFSmartUrlDataLoaderFields *args) :[loadDataIdentifier description]; } - JFFAsyncOperation cachedDataLoader = ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + JFFAsyncOperation cachedDataLoader = ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { JFFAsyncOperationBinder dataLoaderBinder = dataLoaderWithCachedResultBinder(doesNotIgnoreFreshDataLoadFail, dataLoaderForIdentifier, @@ -169,7 +169,7 @@ JFFAsyncOperation jSmartDataLoaderWithCache(JFFSmartUrlDataLoaderFields *args) } return loader(progressCallback, - cancelCallback, + stateCallback, doneCallback); }; diff --git a/lib/JFFScheduler/Async/JFFAsyncOperationHelpers.h b/lib/JFFScheduler/Async/JFFAsyncOperationHelpers.h index 01c21ee..4536e1c 100644 --- a/lib/JFFScheduler/Async/JFFAsyncOperationHelpers.h +++ b/lib/JFFScheduler/Async/JFFAsyncOperationHelpers.h @@ -8,14 +8,28 @@ extern "C" { #endif - JFFAsyncOperation asyncOperationWithDelay(NSTimeInterval delay, NSTimeInterval leeway); + JFFAsyncOperation asyncOperationWithDelay(NSTimeInterval delay, + NSTimeInterval leeway); + + JFFAsyncOperation asyncOperationWithDelayWithDispatchQueue(NSTimeInterval delay, + NSTimeInterval leeway, + dispatch_queue_t callbacksQueue); JFFAsyncOperation asyncOperationAfterDelay(NSTimeInterval delay, NSTimeInterval leeway, JFFAsyncOperation loader); + JFFAsyncOperation asyncOperationAfterDelayWithDispatchQueue(NSTimeInterval delay, + NSTimeInterval leeway, + JFFAsyncOperation loader, + dispatch_queue_t callbacksQueue); + ///////////////////////// AUTO REPEAT CIRCLE //////////////////////// + JFFAsyncOperation repeatAsyncOperationWithDelayLoader(JFFAsyncOperation nativeLoader, + JFFContinueLoaderWithResult continueLoaderBuilder, + NSInteger maxRepeatCount); + JFFAsyncOperation repeatAsyncOperation(JFFAsyncOperation loader, JFFContinueLoaderWithResult continueLoaderBuilder, NSTimeInterval delay, diff --git a/lib/JFFScheduler/Async/JFFAsyncOperationHelpers.m b/lib/JFFScheduler/Async/JFFAsyncOperationHelpers.m index 128db96..fc8b86b 100644 --- a/lib/JFFScheduler/Async/JFFAsyncOperationHelpers.m +++ b/lib/JFFScheduler/Async/JFFAsyncOperationHelpers.m @@ -2,6 +2,7 @@ #import "JFFTimer.h" +#import #import #import @@ -17,59 +18,108 @@ @interface JFFAsyncOperationScheduler : NSObject @implementation JFFAsyncOperationScheduler { JFFTimer *_timer; + JFFDidFinishAsyncOperationCallback _finishCallback; @public NSTimeInterval _duration; NSTimeInterval _leeway; + dispatch_queue_t _callbacksQueue; } -- (void)asyncOperationWithResultHandler:(void(^)(id, NSError *))handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)startIfNeeds { - handler = [handler copy]; + if (_timer) + return; + + __unsafe_unretained JFFAsyncOperationScheduler *unsafeUnretainedSelf = self; _timer = [JFFTimer new]; [_timer addBlock:^(JFFCancelScheduledBlock cancel) { cancel(); - if (handler) - handler([JFFAsyncTimerResult new], nil); - } duration:_duration leeway:_leeway]; + + JFFDidFinishAsyncOperationCallback finishCallback = unsafeUnretainedSelf->_finishCallback; + + if (finishCallback) + finishCallback([JFFAsyncTimerResult new], nil); + } duration:_duration leeway:_leeway dispatchQueue:_callbacksQueue]; +} + +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback +{ + _finishCallback = finishCallback; + + [self startIfNeeds]; } -- (void)cancel:(BOOL)canceled +- (void)doTask:(JFFAsyncOperationHandlerTask)task { - _timer = nil; + switch (task) { + + case JFFAsyncOperationHandlerTaskUnSubscribe: + case JFFAsyncOperationHandlerTaskCancel: + case JFFAsyncOperationHandlerTaskSuspend: + { + _timer = nil; + break; + } + case JFFAsyncOperationHandlerTaskResume: + { + [self startIfNeeds]; + break; + } + default: + { + NSAssert1(NO, @"invalid parameter: %lu", (unsigned long)task); + break; + } + } } @end JFFAsyncOperation asyncOperationWithDelay(NSTimeInterval delay, NSTimeInterval leeway) +{ + NSCAssert([NSThread isMainThread], @"main thread expected"); + return asyncOperationWithDelayWithDispatchQueue(delay, leeway, dispatch_get_main_queue()); +} + +JFFAsyncOperation asyncOperationWithDelayWithDispatchQueue(NSTimeInterval delay, NSTimeInterval leeway, dispatch_queue_t callbacksQueue) { JFFAsyncOperationInstanceBuilder factory = ^id(void) { JFFAsyncOperationScheduler *asyncObject = [JFFAsyncOperationScheduler new]; - asyncObject->_duration = delay; - asyncObject->_leeway = leeway; + asyncObject->_duration = delay; + asyncObject->_leeway = leeway; + asyncObject->_callbacksQueue = callbacksQueue; return asyncObject; }; - return buildAsyncOperationWithAdapterFactory(factory); + return buildAsyncOperationWithAdapterFactoryWithDispatchQueue(factory, callbacksQueue); } JFFAsyncOperation asyncOperationAfterDelay(NSTimeInterval delay, NSTimeInterval leeway, JFFAsyncOperation loader) { - return sequenceOfAsyncOperations(asyncOperationWithDelay(delay, leeway), loader, nil); + NSCAssert([NSThread isMainThread], @"main thread expected"); + return asyncOperationAfterDelayWithDispatchQueue(delay, + leeway, + loader, + dispatch_get_main_queue()); } +JFFAsyncOperation asyncOperationAfterDelayWithDispatchQueue(NSTimeInterval delay, + NSTimeInterval leeway, + JFFAsyncOperation loader, + dispatch_queue_t callbacksQueue) +{ + return sequenceOfAsyncOperations(asyncOperationWithDelayWithDispatchQueue(delay, leeway, callbacksQueue), loader, nil); +} -//TODO test it, on leaks also -JFFAsyncOperation repeatAsyncOperation(JFFAsyncOperation nativeLoader, - JFFContinueLoaderWithResult continueLoaderBuilder, - NSTimeInterval delay, - NSTimeInterval leeway, - NSInteger maxRepeatCount) +JFFAsyncOperation repeatAsyncOperationWithDelayLoader(JFFAsyncOperation nativeLoader, + JFFContinueLoaderWithResult continueLoaderBuilder, + NSInteger maxRepeatCount) { NSCParameterAssert(nativeLoader );//can not be nil NSCParameterAssert(continueLoaderBuilder);//can not be nil @@ -77,39 +127,79 @@ JFFAsyncOperation repeatAsyncOperation(JFFAsyncOperation nativeLoader, nativeLoader = [nativeLoader copy]; continueLoaderBuilder = [continueLoaderBuilder copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { progressCallback = [progressCallback copy]; - cancelCallback = [cancelCallback copy]; + stateCallback = [stateCallback copy]; doneCallback = [doneCallback copy]; - __block JFFCancelAsyncOperation cancelBlockHolder; - + __block JFFAsyncOperationHandler currentLoaderHandlerHolder; __block JFFDidFinishAsyncOperationHook finishHookHolder; + __block JFFAsyncOperationProgressCallback progressCallbackHolder = [progressCallback copy]; + __block JFFAsyncOperationChangeStateCallback stateCallbackHolder = [stateCallback copy]; + __block JFFDidFinishAsyncOperationCallback doneCallbackHolder = [doneCallback copy]; + + JFFAsyncOperationProgressCallback progressCallbackWrapper = ^(id progressInfo) { + + if (progressCallbackHolder) + progressCallbackHolder(progressInfo); + }; + JFFAsyncOperationChangeStateCallback stateCallbackWrapper = ^(JFFAsyncOperationState state) { + + if (stateCallbackHolder) + stateCallbackHolder(state); + }; + JFFDidFinishAsyncOperationCallback doneCallbackkWrapper = ^(id result, NSError *error) { + + if (doneCallbackHolder) { + doneCallbackHolder(result, error); + doneCallbackHolder = nil; + } + }; + __block NSInteger currentLeftCount = maxRepeatCount; + void (^clearCallbacks)(void) = ^() { + progressCallbackHolder = nil; + stateCallbackHolder = nil; + doneCallbackHolder = nil; + }; + JFFDidFinishAsyncOperationHook finishCallbackHook = ^(id result, NSError *error, - JFFDidFinishAsyncOperationHandler doneCallback) { + JFFDidFinishAsyncOperationCallback doneCallback) { + + void (^finish)(void) = ^() { + + finishHookHolder = nil; + doneCallbackkWrapper(result, error); + + clearCallbacks(); + }; + + if ([error isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]]) { + + finish(); + return; + } JFFAsyncOperation newLoader = continueLoaderBuilder(result, error); + if (!newLoader || currentLeftCount == 0) { - finishHookHolder = nil; - if (doneCallback) - doneCallback(result, error); + + finish(); } else { + currentLeftCount = currentLeftCount > 0 ?currentLeftCount - 1 :currentLeftCount; - JFFAsyncOperation loader = asyncOperationWithFinishHookBlock(newLoader, - finishHookHolder); - loader = asyncOperationAfterDelay(delay, leeway, loader); + JFFAsyncOperation loader = asyncOperationWithFinishHookBlock(newLoader, finishHookHolder); - cancelBlockHolder = loader(progressCallback, cancelCallback, doneCallback); + currentLoaderHandlerHolder = loader(progressCallbackWrapper, stateCallbackWrapper, doneCallbackkWrapper); } }; @@ -118,15 +208,47 @@ JFFAsyncOperation repeatAsyncOperation(JFFAsyncOperation nativeLoader, JFFAsyncOperation loader = asyncOperationWithFinishHookBlock(nativeLoader, finishHookHolder); - cancelBlockHolder = loader(progressCallback, cancelCallback, doneCallback); + currentLoaderHandlerHolder = loader(progressCallback, stateCallbackWrapper, doneCallbackkWrapper); - return ^(BOOL canceled) { - finishHookHolder = nil; + return ^void(JFFAsyncOperationHandlerTask task) { + + if (task == JFFAsyncOperationHandlerTaskCancel) + finishHookHolder = nil; - if (!cancelBlockHolder) + if (!currentLoaderHandlerHolder) return; - cancelBlockHolder(canceled); - cancelBlockHolder = nil; + + if (task != JFFAsyncOperationHandlerTaskUnSubscribe) + currentLoaderHandlerHolder(task); + + if (task == JFFAsyncOperationHandlerTaskCancel) + currentLoaderHandlerHolder = nil; + + if (task == JFFAsyncOperationHandlerTaskUnSubscribe) { + + clearCallbacks(); + } }; }; } + +JFFAsyncOperation repeatAsyncOperation(JFFAsyncOperation nativeLoader, + JFFContinueLoaderWithResult continueLoaderBuilder, + NSTimeInterval delay, + NSTimeInterval leeway, + NSInteger maxRepeatCount) +{ + continueLoaderBuilder = [continueLoaderBuilder copy]; + JFFContinueLoaderWithResult continueLoaderBuilderWrapper = ^JFFAsyncOperation(id result, NSError *error) { + + JFFAsyncOperation loader = continueLoaderBuilder(result, error); + if (!loader) + return nil; + + return sequenceOfAsyncOperations(asyncOperationWithDelay(delay, leeway), loader, nil); + }; + + return repeatAsyncOperationWithDelayLoader(nativeLoader, + continueLoaderBuilderWrapper, + maxRepeatCount); +} diff --git a/lib/JFFScheduler/JFFScheduler.xcodeproj/project.pbxproj b/lib/JFFScheduler/JFFScheduler.xcodeproj/project.pbxproj index 5661984..3215054 100755 --- a/lib/JFFScheduler/JFFScheduler.xcodeproj/project.pbxproj +++ b/lib/JFFScheduler/JFFScheduler.xcodeproj/project.pbxproj @@ -7,6 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + 4C1A0FB918257BA00020FBF6 /* JFFAsyncOperationHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4182DD181E64A800FF3CA0 /* JFFAsyncOperationHelpers.m */; }; + 4C1A0FBA18257BA00020FBF6 /* JFFTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4182E1181E6B6700FF3CA0 /* JFFTimer.m */; }; + 4C1A0FBB18257BA70020FBF6 /* JFFAsyncOperationHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4182DD181E64A800FF3CA0 /* JFFAsyncOperationHelpers.m */; }; + 4C1A0FBC18257BA70020FBF6 /* JFFAsyncOperationHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4182DD181E64A800FF3CA0 /* JFFAsyncOperationHelpers.m */; }; 4C4182DE181E64A800FF3CA0 /* JFFAsyncOperationHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C4182DC181E64A800FF3CA0 /* JFFAsyncOperationHelpers.h */; }; 4C4182DF181E64A800FF3CA0 /* JFFAsyncOperationHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4182DD181E64A800FF3CA0 /* JFFAsyncOperationHelpers.m */; }; 4C4182E2181E6B6700FF3CA0 /* JFFTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C4182E0181E6B6700FF3CA0 /* JFFTimer.h */; }; @@ -408,6 +412,7 @@ buildActionMask = 2147483647; files = ( 539103BF14A88BD6007315A3 /* NSObject+Timer.m in Sources */, + 4C1A0FBB18257BA70020FBF6 /* JFFAsyncOperationHelpers.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -416,6 +421,8 @@ buildActionMask = 2147483647; files = ( 65802B18148BFB920040A93A /* NSObject+Timer.m in Sources */, + 4C1A0FBA18257BA00020FBF6 /* JFFTimer.m in Sources */, + 4C1A0FB918257BA00020FBF6 /* JFFAsyncOperationHelpers.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -424,6 +431,7 @@ buildActionMask = 2147483647; files = ( 7E8F203814F9486E00588C7D /* NSObject+Timer.m in Sources */, + 4C1A0FBC18257BA70020FBF6 /* JFFAsyncOperationHelpers.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -489,6 +497,7 @@ buildSettings = { CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; GCC_OPTIMIZATION_LEVEL = 0; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; @@ -509,6 +518,7 @@ buildSettings = { CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; diff --git a/lib/JFFScheduler/NSObject+Timer.m b/lib/JFFScheduler/NSObject+Timer.m index e352b25..df3be8d 100644 --- a/lib/JFFScheduler/NSObject+Timer.m +++ b/lib/JFFScheduler/NSObject+Timer.m @@ -33,9 +33,17 @@ - (void)performSelector:(SEL)selector cancel(); } - numOfArgs == 1 - ?objc_msgSend(unretainedSelf, selector, userInfo) - :objc_msgSend(unretainedSelf, selector); + if (numOfArgs == 1) { + + typedef void (*AlignMsgSendFunction)(id, SEL, id); + AlignMsgSendFunction alignFunction = (AlignMsgSendFunction)objc_msgSend; + alignFunction(unretainedSelf, selector, userInfo); + } else { + + typedef void (*AlignMsgSendFunction)(id, SEL); + AlignMsgSendFunction alignFunction = (AlignMsgSendFunction)objc_msgSend; + alignFunction(unretainedSelf, selector); + } }; JFFCancelScheduledBlock cancel = [timer addBlock:block diff --git a/lib/JFFSocial/JFFSocial.xcodeproj/project.pbxproj b/lib/JFFSocial/JFFSocial.xcodeproj/project.pbxproj index a1e714e..f075d6e 100644 --- a/lib/JFFSocial/JFFSocial.xcodeproj/project.pbxproj +++ b/lib/JFFSocial/JFFSocial.xcodeproj/project.pbxproj @@ -76,6 +76,13 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 4C3C5BDC18674DE8000B235A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = CE4F602415F8B56300271035 /* JFFAsyncOperations.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 4C1A0F8D182577BE0020FBF6; + remoteInfo = JFFAsyncOperationsMacOS; + }; CE4F602A15F8B56300271035 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = CE4F602415F8B56300271035 /* JFFAsyncOperations.xcodeproj */; @@ -615,6 +622,7 @@ CE4F602B15F8B56300271035 /* libJFFAsyncOperations.a */, CE4F602D15F8B56300271035 /* libJFFAsyncOperations-clang.a */, CE4F602F15F8B56300271035 /* JFFAsyncOperationsFW.framework */, + 4C3C5BDD18674DE8000B235A /* libJFFAsyncOperationsMacOS.a */, ); name = Products; sourceTree = ""; @@ -790,7 +798,7 @@ CE4F5FFF15F8B2BB00271035 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0510; ORGANIZATIONNAME = EmbeddedSources; }; buildConfigurationList = CE4F600215F8B2BB00271035 /* Build configuration list for PBXProject "JFFSocial" */; @@ -826,6 +834,13 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ + 4C3C5BDD18674DE8000B235A /* libJFFAsyncOperationsMacOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libJFFAsyncOperationsMacOS.a; + remoteRef = 4C3C5BDC18674DE8000B235A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; CE4F602B15F8B56300271035 /* libJFFAsyncOperations.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1007,7 +1022,6 @@ "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_VERSION = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; @@ -1019,8 +1033,9 @@ ../JFFJsonTools, ../JFFRestKit, ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; @@ -1039,7 +1054,6 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; COPY_PHASE_STRIP = YES; - GCC_VERSION = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; @@ -1051,7 +1065,7 @@ ../JFFJsonTools, ../JFFRestKit, ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -1068,7 +1082,6 @@ ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JFFSocial/JFFSocial-Prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -1085,7 +1098,6 @@ ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JFFSocial/JFFSocial-Prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; diff --git a/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebook.m b/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebook.m index 0475955..31b53cf 100644 --- a/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebook.m +++ b/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebook.m @@ -15,11 +15,11 @@ @implementation JFFFacebookGeneralRequestLoader NSDictionary *_parameters; } -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { - handler = [handler copy]; + finishCallback = [finishCallback copy]; FBRequest *fbRequest = [FBRequest requestForGraphPath:_graphPath]; fbRequest.session = _facebookSession; @@ -30,14 +30,16 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler FBGraphObject *graphObject, NSError *error) { - if (handler) - handler([graphObject copy], error); + if (finishCallback) + finishCallback([graphObject copy], error); }]; } -- (void)cancel:(BOOL)canceled +- (void)doTask:(JFFAsyncOperationHandlerTask)task { - [_requestConnection cancel]; + NSCParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); + if (task == JFFAsyncOperationHandlerTaskCancel) + [_requestConnection cancel]; } @end diff --git a/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebookDialog.m b/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebookDialog.m index a66497e..2fbbd98 100644 --- a/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebookDialog.m +++ b/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebookDialog.m @@ -14,23 +14,21 @@ @implementation JFFAsyncFacebookDialog NSString *_title; } -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { FBWebDialogHandler fbHandler = ^(FBWebDialogResult result, NSURL *resultURL, NSError *error) { - if (result == FBWebDialogResultDialogNotCompleted) { + if (finishCallback) { - if (cancelHandler) - cancelHandler(YES); - } - - if (handler) { + error = (result == FBWebDialogResultDialogNotCompleted) + ?[JFFAsyncOpFinishedByCancellationError new] + :nil; - handler(error?nil:@YES, nil); + finishCallback(error?nil:@YES, error); } }; @@ -41,6 +39,11 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler handler:fbHandler]; } +- (void)doTask:(JFFAsyncOperationHandlerTask)task +{ + NSParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); +} + @end JFFAsyncOperation jffRequestFacebookDialog(FBSession *session, diff --git a/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebookLogin.m b/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebookLogin.m index f91aca3..e050a97 100644 --- a/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebookLogin.m +++ b/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebookLogin.m @@ -17,49 +17,46 @@ @implementation JFFAsyncFacebookLogin #pragma mark - JFFAsyncOperationInterface -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (BOOL)isValidSession:(FBSession *)session { - handler = [handler copy]; + return session.isOpen && session.accessTokenData.accessToken; +} + +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback +{ + finishCallback = [finishCallback copy]; - NSMutableSet *requstPermissions = [[NSMutableSet alloc] initWithArray:_permissions]; + NSMutableSet *requestPermissions = [[NSMutableSet alloc] initWithArray:_permissions]; NSSet *currPermissions = [[NSSet alloc] initWithArray:_facebookSession.permissions]; - if (_facebookSession.isOpen) { + if ([self isValidSession:_facebookSession]) { - BOOL hasAllPermissions = [requstPermissions isSubsetOfSet:currPermissions]; + BOOL hasAllPermissions = [requestPermissions isSubsetOfSet:currPermissions]; if (hasAllPermissions) { [self handleLoginWithSession:_facebookSession error:nil status:_facebookSession.state - handler:handler]; + finishCallback:finishCallback]; return; } } - [requstPermissions unionSet:currPermissions]; + [requestPermissions unionSet:currPermissions]; //exclude publich pemissions { static NSSet *publishPermissions; - // "share_item", - // "photo_upload", - // "video_upload", - // "installed", - // "status_update", - // "email", - // "user_birthday", - // "create_note", if (!publishPermissions) { - publishPermissions = [[NSSet alloc] initWithArray:@[@"publish_actions", @"publish_stream"]]; + publishPermissions = [[NSSet alloc] initWithArray:@[@"publish_actions", @"publish_stream", @"publish_checkins"]]; } - [requstPermissions minusSet:publishPermissions]; + [requestPermissions minusSet:publishPermissions]; } __block BOOL finished = NO; @@ -74,25 +71,33 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler NSError *libError = error?[JFFFacebookSDKErrors newFacebookSDKErrorsWithNativeError:error]:nil; - [weakSelf handleLoginWithSession:session error:libError status:status handler:handler]; + [weakSelf handleLoginWithSession:session error:libError status:status finishCallback:finishCallback]; }; - [FBSession openActiveSessionWithReadPermissions:[requstPermissions allObjects] + [FBSession openActiveSessionWithReadPermissions:[requestPermissions allObjects] allowLoginUI:YES completionHandler:fbHandler]; } +- (void)doTask:(JFFAsyncOperationHandlerTask)task +{ + NSParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); +} + - (void)handleLoginWithSession:(FBSession *)session error:(NSError *)error status:(FBSessionState)status - handler:(JFFAsyncOperationInterfaceResultHandler)handler + finishCallback:(JFFDidFinishAsyncOperationCallback)finishCallback { - if (!error && (!session.isOpen || !session.accessTokenData.accessToken)) { + if (status == FBSessionStateCreatedOpening) + return; + + if (!error && ![self isValidSession:session]) { error = [JFFFacebookAuthorizeError new]; } - if (handler) { - handler(error?nil:session, error); + if (finishCallback) { + finishCallback(error?nil:session, error); } } @@ -100,7 +105,7 @@ - (void)handleLoginWithSession:(FBSession *)session JFFAsyncOperation jffFacebookLogin(FBSession *facebook, NSArray *permissions) { - JFFAsyncOperationInstanceBuilder factory = ^id< JFFAsyncOperationInterface >() { + JFFAsyncOperationInstanceBuilder factory = ^id() { JFFAsyncFacebookLogin *object = [JFFAsyncFacebookLogin new]; diff --git a/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebookLoginWithPublishPermissions.m b/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebookLoginWithPublishPermissions.m index e7d7adc..4df1db5 100644 --- a/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebookLoginWithPublishPermissions.m +++ b/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebookLoginWithPublishPermissions.m @@ -17,11 +17,11 @@ @implementation JFFAsyncFacebookLoginWithPublishPermissions #pragma mark - JFFAsyncOperationInterface -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { - handler = [handler copy]; + finishCallback = [finishCallback copy]; NSMutableSet *requstPermissions = [[NSMutableSet alloc] initWithArray:_permissions]; NSSet *currPermissions = [[NSSet alloc] initWithArray:_facebookSession.permissions]; @@ -35,7 +35,7 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler [self handleLoginWithSession:_facebookSession error:nil status:_facebookSession.state - handler:handler]; + finishCallback:finishCallback]; return; } } @@ -52,7 +52,7 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler NSError *libError = error?[JFFFacebookSDKErrors newFacebookSDKErrorsWithNativeError:error]:nil; - [weakSelf handleLoginWithSession:session error:libError status:status handler:handler]; + [weakSelf handleLoginWithSession:session error:libError status:status finishCallback:finishCallback]; }; [FBSession openActiveSessionWithPublishPermissions:[requstPermissions allObjects] @@ -61,17 +61,22 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler completionHandler:fbHandler]; } +- (void)doTask:(JFFAsyncOperationHandlerTask)task +{ + NSParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); +} + - (void)handleLoginWithSession:(FBSession *)session error:(NSError *)error status:(FBSessionState)status - handler:(JFFAsyncOperationInterfaceResultHandler)handler + finishCallback:(JFFDidFinishAsyncOperationCallback)finishCallback { if (!error && !session.isOpen) { error = [JFFFacebookAuthorizeError new]; } - if (handler) { - handler(error?nil:session, error); + if (finishCallback) { + finishCallback(error?nil:session, error); } } @@ -93,7 +98,7 @@ JFFAsyncOperation jffFacebookLoginWithPublishPermissions(FBSession *facebook, NS NSDictionary *mergeParams = @{ - @"method" : @"jffFacebookLoginWithPublishPermissions", + @"method" : @(__FUNCTION__), @"permissions" : [[NSSet alloc] initWithArray:permissions], @"class" : NSStringFromClass([JFFAsyncFacebookLoginWithPublishPermissions class]) }; diff --git a/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebookLogout.m b/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebookLogout.m index 2fbcbee..1c7483c 100644 --- a/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebookLogout.m +++ b/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFAsyncFacebookLogout.m @@ -7,7 +7,7 @@ @interface JFFAsyncFacebookLogout : NSObject @implementation JFFAsyncFacebookLogout { - JFFAsyncOperationInterfaceResultHandler _handler; + JFFDidFinishAsyncOperationCallback _finishCallback; @public FBSession *_session; BOOL _renewSystemAuthorization; @@ -15,7 +15,7 @@ @implementation JFFAsyncFacebookLogout #pragma mark - JFFAsyncOperationInterface -- (void)logout +- (void)logOut { [_session closeAndClearTokenInformation]; @@ -23,28 +23,33 @@ - (void)logout [self performSelector:@selector(notifyFinished) withObject:nil afterDelay:1.]; } -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { - _handler = [handler copy]; + _finishCallback = [finishCallback copy]; if (_renewSystemAuthorization) { [FBSession renewSystemCredentials:^(ACAccountCredentialRenewResult result, NSError *error) { - [self logout]; + [self logOut]; }]; return; } - [self logout]; + [self logOut]; +} + +- (void)doTask:(JFFAsyncOperationHandlerTask)task +{ + NSParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); } - (void)notifyFinished { - _handler(@YES, nil); + _finishCallback(@YES, nil); } @end diff --git a/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFFacebookPublishAccessRequestAdapter.m b/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFFacebookPublishAccessRequestAdapter.m index 810c037..09a0173 100644 --- a/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFFacebookPublishAccessRequestAdapter.m +++ b/lib/JFFSocial/JFFSocial/Facebook/AsyncAdapters/JFFFacebookPublishAccessRequestAdapter.m @@ -17,11 +17,11 @@ @implementation JFFFacebookPublishAccessRequestAdapter #pragma mark - JFFAsyncOperationInterface -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { - handler = [handler copy]; + finishCallback = [finishCallback copy]; BOOL hasAllPermissions = [_permissions all:^BOOL(NSString *permission) { @@ -32,7 +32,7 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler [self handleLoginWithSession:_session error:nil - handler:handler]; + finishCallback:finishCallback]; return; } @@ -45,7 +45,7 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler [self handleLoginWithSession:session error:libError - handler:handler]; + finishCallback:finishCallback]; }; [_session requestNewPublishPermissions:_permissions @@ -69,7 +69,7 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler [weakSelf handleLoginWithSession:session error:libError - handler:handler]; + finishCallback:finishCallback]; }; [FBSession openActiveSessionWithPublishPermissions:_permissions @@ -78,15 +78,20 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler completionHandler:fbHandler]; } +- (void)doTask:(JFFAsyncOperationHandlerTask)task +{ + NSParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); +} + - (void)handleLoginWithSession:(FBSession *)session error:(NSError *)error - handler:(JFFAsyncOperationInterfaceResultHandler)handler + finishCallback:(JFFDidFinishAsyncOperationCallback)finishCallback { if (!error && !session.isOpen) { error = [JFFFacebookRequestPublishingAccessError new]; } - if (handler) { - handler(error?nil:session, error); + if (finishCallback) { + finishCallback(error?nil:session, error); } } @@ -108,7 +113,7 @@ JFFAsyncOperation jffFacebookPublishAccessRequest(FBSession *session, NSArray *p NSDictionary *mergeParams = @{ - @"method" : @"jffFacebookPublishAccessRequest", + @"method" : @(__FUNCTION__), @"permissions" : [[NSSet alloc] initWithArray:permissions], @"class" : NSStringFromClass([JFFFacebookPublishAccessRequestAdapter class]) }; diff --git a/lib/JFFSocial/JFFSocial/Facebook/JFFSocialFacebook.h b/lib/JFFSocial/JFFSocial/Facebook/JFFSocialFacebook.h index 592c506..6b8ddf8 100644 --- a/lib/JFFSocial/JFFSocial/Facebook/JFFSocialFacebook.h +++ b/lib/JFFSocial/JFFSocial/Facebook/JFFSocialFacebook.h @@ -2,7 +2,9 @@ #import -@class FBSession; +@class +UIImage, +FBSession; @interface JFFSocialFacebook : NSObject diff --git a/lib/JFFSocial/JFFSocial/Facebook/JFFSocialFacebook.m b/lib/JFFSocial/JFFSocial/Facebook/JFFSocialFacebook.m index c601d11..e2b3b8f 100644 --- a/lib/JFFSocial/JFFSocial/Facebook/JFFSocialFacebook.m +++ b/lib/JFFSocial/JFFSocial/Facebook/JFFSocialFacebook.m @@ -17,7 +17,6 @@ @implementation JFFSocialFacebook + (NSArray *)authPermissions { NSArray *result = @[@"email", @"user_birthday"]; - return result; } @@ -44,9 +43,9 @@ + (BOOL)isActiveFacebookSession + (JFFAsyncOperation)logoutLoaderWithRenewSystemAuthorization:(BOOL)renewSystemAuthorization { - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { FBSession *session = [FBSession activeSession]; @@ -55,7 +54,7 @@ + (JFFAsyncOperation)logoutLoaderWithRenewSystemAuthorization:(BOOL)renewSystemA :asyncOperationWithResult([NSNull new]); doneCallback = [doneCallback copy]; - JFFDidFinishAsyncOperationHandler doneCallbackWrapper = ^(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallbackWrapper = ^(id result, NSError *error) { if (result) [self setFacebookSession:nil]; @@ -65,16 +64,16 @@ + (JFFAsyncOperation)logoutLoaderWithRenewSystemAuthorization:(BOOL)renewSystemA }; return loader(progressCallback, - cancelCallback, + stateCallback, doneCallbackWrapper); }; } + (JFFAsyncOperation)authFacebookSessionLoaderWithPermissions:(NSArray *)permissions { - JFFAsyncOperation loader = ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + JFFAsyncOperation loader = ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { //TODO split perrmissions, first login for "email" "birthday" //tthen for other ones @@ -87,7 +86,7 @@ + (JFFAsyncOperation)authFacebookSessionLoaderWithPermissions:(NSArray *)permiss JFFAsyncOperation loader = jffFacebookLogin(session, permissions); doneCallback = [doneCallback copy]; - JFFDidFinishAsyncOperationHandler doneCallbackWrapper = ^(FBSession *session, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallbackWrapper = ^(FBSession *session, NSError *error) { if (session) [self setFacebookSession:session]; @@ -96,7 +95,7 @@ + (JFFAsyncOperation)authFacebookSessionLoaderWithPermissions:(NSArray *)permiss doneCallback(session, error); }; - return loader(progressCallback, cancelCallback, doneCallbackWrapper); + return loader(progressCallback, stateCallback, doneCallbackWrapper); }; id mergeObject = @@ -109,9 +108,9 @@ + (JFFAsyncOperation)authFacebookSessionLoaderWithPermissions:(NSArray *)permiss + (JFFAsyncOperation)authFacebookSessionWithPublishPermissions:(NSArray *)permissions { - JFFAsyncOperation loader = ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + JFFAsyncOperation loader = ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { FBSession *session = [self facebookSession]; @@ -121,7 +120,7 @@ + (JFFAsyncOperation)authFacebookSessionWithPublishPermissions:(NSArray *)permis JFFAsyncOperation loader = jffFacebookLoginWithPublishPermissions(session, [currPermissions allObjects]); doneCallback = [doneCallback copy]; - JFFDidFinishAsyncOperationHandler doneCallbackWrapper = ^(FBSession *session, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallbackWrapper = ^(FBSession *session, NSError *error) { if (session) [self setFacebookSession:session]; @@ -130,7 +129,7 @@ + (JFFAsyncOperation)authFacebookSessionWithPublishPermissions:(NSArray *)permis doneCallback(session, error); }; - return loader(progressCallback, cancelCallback, doneCallbackWrapper); + return loader(progressCallback, stateCallback, doneCallbackWrapper); }; id mergeObject = diff --git a/lib/JFFSocial/JFFSocial/Facebook/Model/JFFSocialFacebookUser.h b/lib/JFFSocial/JFFSocial/Facebook/Model/JFFSocialFacebookUser.h index c3208e0..c07a7c6 100644 --- a/lib/JFFSocial/JFFSocial/Facebook/Model/JFFSocialFacebookUser.h +++ b/lib/JFFSocial/JFFSocial/Facebook/Model/JFFSocialFacebookUser.h @@ -1,4 +1,5 @@ #import +#import @interface JFFSocialFacebookUser : NSObject diff --git a/lib/JFFSocial/JFFSocial/Foursquare/AsyncAdapters/JFFAsyncFoursquaerLogin.m b/lib/JFFSocial/JFFSocial/Foursquare/AsyncAdapters/JFFAsyncFoursquaerLogin.m index 5d332c7..35422f9 100644 --- a/lib/JFFSocial/JFFSocial/Foursquare/AsyncAdapters/JFFAsyncFoursquaerLogin.m +++ b/lib/JFFSocial/JFFSocial/Foursquare/AsyncAdapters/JFFAsyncFoursquaerLogin.m @@ -1,50 +1,21 @@ #import "JFFAsyncFoursquaerLogin.h" -#import - #import "JFFFoursquareSessionStorage.h" -//TODO remove this class -@interface JFFAsyncFoursquaerLogin : NSObject - -@property (copy, nonatomic) JFFCancelAsyncOperation cancelOperation; - -@end - -@implementation JFFAsyncFoursquaerLogin -{ - JFFCancelAsyncOperation _cancelOperation; -} - -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress -{ - handler = [handler copy]; - - UIApplication *application = [UIApplication sharedApplication]; - NSURL *url = [[JFFFoursquareSessionStorage authURLString] toURL]; - JFFAsyncOperation loader = [application asyncOperationWithApplicationURL:url]; - - _cancelOperation = loader(nil, nil, ^(id result, NSError *error) { - handler(result, error); - }); -} - -- (void)cancel:(BOOL)canceled -{ - if (_cancelOperation) { - _cancelOperation(canceled); - } -} - -@end +#import JFFAsyncOperation jffFoursquareLoginLoader(void) { - JFFAsyncOperationInstanceBuilder factory = ^id< JFFAsyncOperationInterface >() { - return [JFFAsyncFoursquaerLogin new]; + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { + + UIApplication *application = [UIApplication sharedApplication]; + NSURL *url = [[JFFFoursquareSessionStorage authURLString] toURL]; + JFFAsyncOperation loader = [application asyncOperationWithApplicationURL:url]; + + return loader(progressCallback, + stateCallback, + doneCallback); }; - - return buildAsyncOperationWithAdapterFactory(factory); } \ No newline at end of file diff --git a/lib/JFFSocial/JFFSocial/Foursquare/FoursquareSession/JFFFoursquareSessionStorage.h b/lib/JFFSocial/JFFSocial/Foursquare/FoursquareSession/JFFFoursquareSessionStorage.h index 0eed4f2..fbab1a4 100644 --- a/lib/JFFSocial/JFFSocial/Foursquare/FoursquareSession/JFFFoursquareSessionStorage.h +++ b/lib/JFFSocial/JFFSocial/Foursquare/FoursquareSession/JFFFoursquareSessionStorage.h @@ -14,7 +14,7 @@ + (NSString *)accessTokenWithURL:(NSURL *)url; -- (void)openSessionWithHandler:(JFFDidFinishAsyncOperationHandler)hendler; +- (void)openSessionWithHandler:(JFFDidFinishAsyncOperationCallback)hendler; + (NSString *)redirectURI; diff --git a/lib/JFFSocial/JFFSocial/Foursquare/FoursquareSession/JFFFoursquareSessionStorage.m b/lib/JFFSocial/JFFSocial/Foursquare/FoursquareSession/JFFFoursquareSessionStorage.m index 2c087de..bc92554 100644 --- a/lib/JFFSocial/JFFSocial/Foursquare/FoursquareSession/JFFFoursquareSessionStorage.m +++ b/lib/JFFSocial/JFFSocial/Foursquare/FoursquareSession/JFFFoursquareSessionStorage.m @@ -2,6 +2,8 @@ #import "JFFFoursquareAuthURLError.h" +#import + #define FOURSQUARE_ACCESS_TOKEN_KEY @"FOURSQUARE_ACCESS_TOKEN_KEY" #define FOURSQUARE_AUTH_URL_FORMAT @"https://foursquare.com/oauth2/authenticate?client_id=%@&response_type=token&redirect_uri=%@" @@ -17,7 +19,7 @@ @interface JFFFoursquareSessionStorage () -@property (copy, nonatomic) JFFDidFinishAsyncOperationHandler authorizeHendler; +@property (copy, nonatomic) JFFDidFinishAsyncOperationCallback authorizeHendler; @end @@ -57,7 +59,7 @@ + (void)saveAccessToken:(NSString *)accessToken #pragma mark - Authorization -- (void)openSessionWithHandler:(JFFDidFinishAsyncOperationHandler)hendler +- (void)openSessionWithHandler:(JFFDidFinishAsyncOperationCallback)hendler { self.authorizeHendler = hendler; diff --git a/lib/JFFSocial/JFFSocial/Foursquare/JFFSocialFoursquare.h b/lib/JFFSocial/JFFSocial/Foursquare/JFFSocialFoursquare.h index 39fcdc8..f11839c 100644 --- a/lib/JFFSocial/JFFSocial/Foursquare/JFFSocialFoursquare.h +++ b/lib/JFFSocial/JFFSocial/Foursquare/JFFSocialFoursquare.h @@ -2,6 +2,8 @@ #import +@class UIImage; + @interface JFFSocialFoursquare : NSObject + (JFFAsyncOperation)authLoader; diff --git a/lib/JFFSocial/JFFSocial/Foursquare/JFFSocialFoursquare.m b/lib/JFFSocial/JFFSocial/Foursquare/JFFSocialFoursquare.m index b25ed62..f656779 100644 --- a/lib/JFFSocial/JFFSocial/Foursquare/JFFSocialFoursquare.m +++ b/lib/JFFSocial/JFFSocial/Foursquare/JFFSocialFoursquare.m @@ -16,14 +16,16 @@ #import "JFFFoursquareNotFoundUsersCheckinsError.h" +#import + @implementation JFFSocialFoursquare #pragma mark - Common + (JFFAsyncOperationBinder)serverResponseAnalyzer { - return ^JFFAsyncOperation (NSDictionary *response) - { + return ^JFFAsyncOperation(NSDictionary *response) { + return asyncOperationWithSyncOperation(^id(NSError *__autoreleasing *outError) { id result = [NSDictionary fqApiresponseDictWithDict:response error:outError]; return result; @@ -36,6 +38,7 @@ + (JFFAsyncOperationBinder)serverResponseAnalyzer + (JFFAsyncOperation)cachedAuthLoader { return asyncOperationWithSyncOperation(^id(NSError *__autoreleasing *outError) { + NSString *cachedAccessToken = [JFFFoursquareSessionStorage accessToken]; if (cachedAccessToken) { @@ -55,11 +58,11 @@ + (JFFAsyncOperation)authLoader { NSString *accessToken = [JFFFoursquareSessionStorage accessTokenWithURL:url]; if (accessToken) { + [JFFFoursquareSessionStorage saveAccessToken:accessToken]; return asyncOperationWithResult(accessToken); - } - else - { + } else { + return asyncOperationWithError([JFFFoursquareAuthInvalidAccessTokenError new]); } }; @@ -110,8 +113,8 @@ + (JFFAsyncOperation)checkinsLoaderWithUserId:(NSString *)userID limit:(NSIntege NSDictionary *params = @{ @"limit" : @(limit)}; - JFFAsyncOperationBinder checkinsBinder = ^JFFAsyncOperation (NSString *accessToken) - { + JFFAsyncOperationBinder checkinsBinder = ^JFFAsyncOperation(NSString *accessToken) { + return bindSequenceOfAsyncOperations(jffFoursquareRequestLoader(fqLoadCheckinsURL, @"GET", accessToken, params), asyncOperationBinderJsonDataParser(), [self serverResponseAnalyzer], @@ -126,8 +129,8 @@ + (JFFAsyncOperation)checkinsLoaderWithUserId:(NSString *)userID limit:(NSIntege + (JFFAsyncOperationBinder)checkinsParser { - return ^JFFAsyncOperation (NSDictionary *response) - { + return ^JFFAsyncOperation(NSDictionary *response) { + return asyncOperationWithSyncOperation(^id(NSError *__autoreleasing *outError) { NSArray *checkins = [NSArray fqCheckinsWithDict:response error:outError]; return checkins; @@ -262,15 +265,15 @@ + (JFFAsyncOperation)inviteUserLoader:(NSString *)userID text:(NSString *)text url:(NSString *)url { - JFFAsyncOperationBinder addPostBinder = ^JFFAsyncOperation(NSArray *checkins) - { - FoursquareCheckinsModel *lastCheckin = (([checkins count]>0)?checkins[0]:nil); + JFFAsyncOperationBinder addPostBinder = ^JFFAsyncOperation(NSArray *checkins) { + + FoursquareCheckinsModel *lastCheckin = [checkins firstObject]; if (!lastCheckin) { return asyncOperationWithError([JFFFoursquareNotFoundUsersCheckinsError new]); } // return [self addPostToCheckin:lastCheckin.checkinID withText:text url:url contentID:nil]; - return [self postComment:@"http://wishdates.com" toCheckin:lastCheckin.checkinID]; + return [self postComment:@"Just Comment )" toCheckin:lastCheckin.checkinID]; }; return bindSequenceOfAsyncOperations([self checkinsLoaderWithUserId:userID limit:1], addPostBinder, nil); diff --git a/lib/JFFSocial/JFFSocial/Instagram/JFFSocialInstagram.m b/lib/JFFSocial/JFFSocial/Instagram/JFFSocialInstagram.m index 3d8a6f3..a2597cc 100644 --- a/lib/JFFSocial/JFFSocial/Instagram/JFFSocialInstagram.m +++ b/lib/JFFSocial/JFFSocial/Instagram/JFFSocialInstagram.m @@ -35,9 +35,9 @@ + (JFFAsyncOperation)userLoaderForForUserId:(NSString *)userId + (JFFAsyncOperation)instagramAccessTokenLoaderForCredentials:(JFFInstagramCredentials *)redentials { - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { JFFAsyncOperation accountLoader = [self authedUserLoaderWithCredentials:redentials]; @@ -51,26 +51,26 @@ + (JFFAsyncOperation)instagramAccessTokenLoaderForCredentials:(JFFInstagramCrede asyncOperation:loader]; return loader(progressCallback, - cancelCallback, + stateCallback, doneCallback); }; } + (JFFAsyncOperation)authedUserLoaderWithCredentials:(JFFInstagramCredentials *)redentials { - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { JFFAsyncOperation oAuthUrlLoader = codeURLLoader(redentials.redirectURI, redentials.clientId); JFFAsyncOperationBinder urlToCodeBinder = ^JFFAsyncOperation(NSURL *url) { NSDictionary *params = [[url query] dictionaryFromQueryComponents]; - NSArray* codeParams = params[@"code"]; + NSArray *codeParams = params[@"code"]; + + if ([codeParams count] == 0) { - if ([codeParams count]==0) - { JFFInvalidInstagramResponseURLError *error = [JFFInvalidInstagramResponseURLError new]; error.url = url; return asyncOperationWithError(error); @@ -96,7 +96,7 @@ + (JFFAsyncOperation)authedUserLoaderWithCredentials:(JFFInstagramCredentials *) nil); return loader(progressCallback, - cancelCallback, + stateCallback, doneCallback); }; } diff --git a/lib/JFFSocial/JFFSocial/Instagram/Model/JFFInstagramMediaItemImage.h b/lib/JFFSocial/JFFSocial/Instagram/Model/JFFInstagramMediaItemImage.h index 65eb38a..dee31cc 100644 --- a/lib/JFFSocial/JFFSocial/Instagram/Model/JFFInstagramMediaItemImage.h +++ b/lib/JFFSocial/JFFSocial/Instagram/Model/JFFInstagramMediaItemImage.h @@ -1,4 +1,5 @@ #import +#import @interface JFFInstagramMediaItemImage : NSObject diff --git a/lib/JFFSocial/JFFSocial/Twitter/AsyncAdapters/JFFAsyncTwitterAccessRequest.m b/lib/JFFSocial/JFFSocial/Twitter/AsyncAdapters/JFFAsyncTwitterAccessRequest.m index 5a294ec..00e8669 100644 --- a/lib/JFFSocial/JFFSocial/Twitter/AsyncAdapters/JFFAsyncTwitterAccessRequest.m +++ b/lib/JFFSocial/JFFSocial/Twitter/AsyncAdapters/JFFAsyncTwitterAccessRequest.m @@ -9,11 +9,11 @@ @interface JFFAsyncTwitterAccessRequest : NSObject @implementation JFFAsyncTwitterAccessRequest -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { - handler = [handler copy]; + finishCallback = [finishCallback copy]; ACAccountStore *accountStore = [ACAccountStore new]; @@ -23,21 +23,26 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler options:nil completion:^(BOOL granted, NSError *error) { - if (!handler) + if (!finishCallback) return; if (error) { - handler(nil, error); + finishCallback(nil, error); } else { if (granted) { - handler([NSNull new], nil); + finishCallback([NSNull new], nil); } else { - handler(nil, [JFFTwitterAccountAccessNotGrantedError new]); + finishCallback(nil, [JFFTwitterAccountAccessNotGrantedError new]); } } }]; } +- (void)doTask:(JFFAsyncOperationHandlerTask)task +{ + NSParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); +} + - (BOOL)isForeignThreadResultCallback { return YES; diff --git a/lib/JFFSocial/JFFSocial/Twitter/AsyncAdapters/JFFAsyncTwitterRequest.m b/lib/JFFSocial/JFFSocial/Twitter/AsyncAdapters/JFFAsyncTwitterRequest.m index da3027b..192f633 100644 --- a/lib/JFFSocial/JFFSocial/Twitter/AsyncAdapters/JFFAsyncTwitterRequest.m +++ b/lib/JFFSocial/JFFSocial/Twitter/AsyncAdapters/JFFAsyncTwitterRequest.m @@ -14,29 +14,34 @@ @implementation JFFAsyncTwitterRequest SLRequest *_request; } -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { [_request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { - if (!handler) + if (!finishCallback) return; if (error) { - handler(nil, error); + finishCallback(nil, error); } else { JFFTwitterResponse *result = [JFFTwitterResponse new]; result.responseData = responseData; result.urlResponse = urlResponse; - handler(result, nil); + finishCallback(result, nil); } }]; } +- (void)doTask:(JFFAsyncOperationHandlerTask)task +{ + NSParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); +} + - (BOOL)isForeignThreadResultCallback { return YES; diff --git a/lib/JFFSocial/JFFSocial/Twitter/JFFSocialTwitter.h b/lib/JFFSocial/JFFSocial/Twitter/JFFSocialTwitter.h index ed0a87d..acd39e6 100644 --- a/lib/JFFSocial/JFFSocial/Twitter/JFFSocialTwitter.h +++ b/lib/JFFSocial/JFFSocial/Twitter/JFFSocialTwitter.h @@ -10,7 +10,7 @@ typedef void(^JFFSocialTwitterDidLoginCallback)(NSString *login); + (JFFAsyncOperation)authorizationLoader; -+ (JFFAsyncOperation)usersNearbyCoordinatesLantitude:(double)lantitude longitude:(double)longitude; ++ (JFFAsyncOperation)usersNearbyCoordinatesLatitude:(double)latitude longitude:(double)longitude; + (JFFAsyncOperation)followersLoader; diff --git a/lib/JFFSocial/JFFSocial/Twitter/JFFSocialTwitter.m b/lib/JFFSocial/JFFSocial/Twitter/JFFSocialTwitter.m index 2f2efdf..3b4c46f 100644 --- a/lib/JFFSocial/JFFSocial/Twitter/JFFSocialTwitter.m +++ b/lib/JFFSocial/JFFSocial/Twitter/JFFSocialTwitter.m @@ -36,9 +36,9 @@ - (NSCache *)cache - (JFFAsyncOperation)loaderToSetData:(NSData *)data forKey:(NSString *)key { - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { JFFResponseDataWithUpdateData *cachedData = [JFFResponseDataWithUpdateData new]; @@ -50,15 +50,15 @@ - (JFFAsyncOperation)loaderToSetData:(NSData *)data forKey:(NSString *)key if (doneCallback) doneCallback([NSNull new], nil); - return JFFStubCancelAsyncOperationBlock; + return JFFStubHandlerAsyncOperationBlock; }; } - (JFFAsyncOperation)cachedDataLoaderForKey:(NSString *)key { - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { if (doneCallback) { @@ -66,7 +66,7 @@ - (JFFAsyncOperation)cachedDataLoaderForKey:(NSString *)key doneCallback(cachedData, cachedData?nil:[JFFSilentError newErrorWithDescription:@"no data for key"]); } - return JFFStubCancelAsyncOperationBlock; + return JFFStubHandlerAsyncOperationBlock; }; } @@ -155,7 +155,7 @@ + (JFFAsyncOperationBinder)dataLoaderForIdentifier }; } -+ (JFFAsyncBinderForIdentifier)analyzerForDataWithAnalizer:(JFFAsyncOperationBinder)ayncAnalyzer ++ (JFFAsyncBinderForIdentifier)analyzerForDataWithAnalyzer:(JFFAsyncOperationBinder)ayncAnalyzer { ayncAnalyzer = [ayncAnalyzer copy]; @@ -203,9 +203,9 @@ + (JFFAsyncOperation)generalTwitterApiDataLoaderWithURLString:(NSString *)urlStr { ayncAnalyzer = [ayncAnalyzer copy]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { id loadDataIdentifier = @{ @@ -219,15 +219,15 @@ + (JFFAsyncOperation)generalTwitterApiDataLoaderWithURLString:(NSString *)urlStr if (cacheDataLifeTimeInSeconds == 0.) { loader = bindSequenceOfAsyncOperations([self dataLoaderForIdentifier](loadDataIdentifier), - [self analyzerForDataWithAnalizer:ayncAnalyzer](loadDataIdentifier), + [self analyzerForDataWithAnalyzer:ayncAnalyzer](loadDataIdentifier), nil); } else { - JFFSmartUrlDataLoaderFields *args = [JFFSmartUrlDataLoaderFields new]; + JFFSmartDataLoaderFields *args = [JFFSmartDataLoaderFields new]; args.loadDataIdentifier = loadDataIdentifier; args.dataLoaderForIdentifier = [self dataLoaderForIdentifier]; - args.analyzerForData = [self analyzerForDataWithAnalizer:ayncAnalyzer]; + args.analyzerForData = [self analyzerForDataWithAnalyzer:ayncAnalyzer]; args.cacheKeyForIdentifier = [self cacheKeyForIdentifier]; args.cacheDataLifeTimeInSeconds = cacheDataLifeTimeInSeconds; args.cache = self.cache; @@ -236,7 +236,7 @@ + (JFFAsyncOperation)generalTwitterApiDataLoaderWithURLString:(NSString *)urlStr } return loader(progressCallback, - cancelCallback, + stateCallback, doneCallback); }; } @@ -253,13 +253,13 @@ + (JFFAsyncOperation)generalTwitterApiDataLoaderWithURLString:(NSString *)urlStr cacheDataLifeTimeInSeconds:0.]; } -+ (JFFAsyncOperation)usersNearbyCoordinatesLantitude:(double)lantitude longitude:(double)longitude ++ (JFFAsyncOperation)usersNearbyCoordinatesLatitude:(double)latitude longitude:(double)longitude { static NSString *geocodeFormat = @"%f,%f,100mi"; id params = @{ @"q" : @"", - @"geocode" : [[NSString alloc] initWithFormat:geocodeFormat, lantitude, longitude], + @"geocode" : [[NSString alloc] initWithFormat:geocodeFormat, latitude, longitude], @"count" : @"100", @"include_entities" : @"true", @"result_type" : @"recent", @@ -321,11 +321,8 @@ + (JFFAsyncOperation)sendDirectMessage:(NSString *)message requestMethod:SLRequestMethodPOST ayncAnalyzer:asyncJSONObjectToDirectTweet()]; - loader = asyncOperationWithFinishHookBlock(loader, ^(id result, NSError *error, JFFDidFinishAsyncOperationHandler doneCallback) { + loader = asyncOperationWithFinishHookBlock(loader, ^(id result, NSError *error, JFFDidFinishAsyncOperationCallback doneCallback) { - if (!doneCallback) - return; - if ([error isKindOfClass:[JFFTwitterDirectMessageAlreadySentError class]]) { result = [NSNull new]; diff --git a/lib/JFFStoreKit/JFFStoreKit.xcodeproj/project.pbxproj b/lib/JFFStoreKit/JFFStoreKit.xcodeproj/project.pbxproj index ff26fc8..f248adc 100644 --- a/lib/JFFStoreKit/JFFStoreKit.xcodeproj/project.pbxproj +++ b/lib/JFFStoreKit/JFFStoreKit.xcodeproj/project.pbxproj @@ -29,6 +29,13 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 4C14CAA61827E47D00371E39 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = CEBCBDEB1619A425007F805F /* JFFAsyncOperations.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 4C1A0F8D182577BE0020FBF6; + remoteInfo = JFFAsyncOperationsMacOS; + }; CEBCBDF81619A426007F805F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = CEBCBDEB1619A425007F805F /* JFFAsyncOperations.xcodeproj */; @@ -183,6 +190,7 @@ CEBCBDF91619A426007F805F /* libJFFAsyncOperations.a */, CEBCBDFB1619A426007F805F /* libJFFAsyncOperations-clang.a */, CEBCBDFD1619A426007F805F /* JFFAsyncOperationsFW.framework */, + 4C14CAA71827E47D00371E39 /* libJFFAsyncOperationsMacOS.a */, ); name = Products; sourceTree = ""; @@ -349,7 +357,8 @@ CED002251619A33E00368E7D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastTestingUpgradeCheck = 0510; + LastUpgradeCheck = 0510; ORGANIZATIONNAME = EmbeddedSources; }; buildConfigurationList = CED002281619A33E00368E7D /* Build configuration list for PBXProject "JFFStoreKit" */; @@ -381,6 +390,13 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ + 4C14CAA71827E47D00371E39 /* libJFFAsyncOperationsMacOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libJFFAsyncOperationsMacOS.a; + remoteRef = 4C14CAA61827E47D00371E39 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; CEBCBDF91619A426007F805F /* libJFFAsyncOperations.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -523,6 +539,7 @@ CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; COPY_PHASE_STRIP = NO; @@ -541,8 +558,9 @@ ../, ., ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; @@ -554,6 +572,7 @@ CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; COPY_PHASE_STRIP = YES; @@ -565,7 +584,7 @@ ../, ., ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -578,7 +597,6 @@ DSTROOT = /tmp/JFFStoreKit.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JFFStoreKit/JFFStoreKit-Prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -591,7 +609,6 @@ DSTROOT = /tmp/JFFStoreKit.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JFFStoreKit/JFFStoreKit-Prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; diff --git a/lib/JFFStoreKit/JFFStoreKit/Errors/JFFStoreKitCanNoLoadProductError.m b/lib/JFFStoreKit/JFFStoreKit/Errors/JFFStoreKitCanNoLoadProductError.m index 25b458e..e7799f1 100644 --- a/lib/JFFStoreKit/JFFStoreKit/Errors/JFFStoreKitCanNoLoadProductError.m +++ b/lib/JFFStoreKit/JFFStoreKit/Errors/JFFStoreKitCanNoLoadProductError.m @@ -18,6 +18,14 @@ - (instancetype)copyWithZone:(NSZone *)zone return copy; } +- (NSString *)errorLogDescription +{ + return [[NSString alloc] initWithFormat:@"%@ : %@ productIdentifier:%@", + [self class], + [self localizedDescription], + _productIdentifier]; +} + - (void)writeErrorWithJFFLogger { } diff --git a/lib/JFFStoreKit/JFFStoreKit/Errors/JFFStoreKitTransactionStateFailedError.m b/lib/JFFStoreKit/JFFStoreKit/Errors/JFFStoreKitTransactionStateFailedError.m index 355c63d..7e7f4da 100644 --- a/lib/JFFStoreKit/JFFStoreKit/Errors/JFFStoreKitTransactionStateFailedError.m +++ b/lib/JFFStoreKit/JFFStoreKit/Errors/JFFStoreKitTransactionStateFailedError.m @@ -1,5 +1,14 @@ #import "JFFStoreKitTransactionStateFailedError.h" +@implementation NSError (iTunesStoreError) + +- (BOOL)isItunesStoreError +{ + return [@"Cannot connect to iTunes Store" isEqualToString:self.description]; +} + +@end + @implementation JFFStoreKitTransactionStateFailedError - (instancetype)init @@ -19,8 +28,26 @@ - (instancetype)copyWithZone:(NSZone *)zone return copy; } +- (NSString *)errorLogDescription +{ + return [[NSString alloc] initWithFormat:@"%@ : %@, domain : %@ code : %ld transaction nativeError : %@ payment : %@", + [self class], + [self localizedDescription], + [self domain], + (long)[self code], + _transaction.error, + _transaction.payment.productIdentifier + ]; +} + - (void)writeErrorWithJFFLogger { + if ([_transaction.error isItunesStoreError]) { + + [super writeErrorToNSLog]; + return; + } + [super writeErrorWithJFFLogger]; } @end diff --git a/lib/JFFStoreKit/JFFStoreKit/asyncAdapters/asyncSKFinishTransaction.m b/lib/JFFStoreKit/JFFStoreKit/asyncAdapters/asyncSKFinishTransaction.m index 492cd84..5d621f6 100644 --- a/lib/JFFStoreKit/JFFStoreKit/asyncAdapters/asyncSKFinishTransaction.m +++ b/lib/JFFStoreKit/JFFStoreKit/asyncAdapters/asyncSKFinishTransaction.m @@ -17,13 +17,13 @@ @implementation JFFAsyncSKFinishTransaction SKPaymentQueue *_queue; SKPaymentTransaction *_transaction; BOOL _addedToObservers; - JFFAsyncOperationInterfaceResultHandler _handler; + JFFDidFinishAsyncOperationCallback _finishCallback; } - (void)dealloc { [self unsubscribeFromObservervation]; - _handler = nil; + _finishCallback = nil; } - (void)doNothing:(id)objetc @@ -53,16 +53,16 @@ + (instancetype)newFAsyncSKFinishTransactionWithTransaction:(SKPaymentTransactio return result; } -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { if (![SKPaymentQueue canMakePayments]) { - handler(nil, [JFFStoreKitDisabledError new]); + finishCallback(nil, [JFFStoreKitDisabledError new]); return; } - _handler = [handler copy]; + _finishCallback = [finishCallback copy]; [_queue finishTransaction:_transaction]; @@ -74,10 +74,18 @@ - (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler } } +- (void)doTask:(JFFAsyncOperationHandlerTask)task +{ + NSParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); + + if (task == JFFAsyncOperationHandlerTaskUnSubscribe) + [self unsubscribeFromObservervation]; +} + - (void)finishOperation { [self unsubscribeFromObservervation]; - _handler(_transaction, nil); + _finishCallback(_transaction, nil); } #pragma mark SKPaymentTransactionObserver @@ -101,8 +109,9 @@ - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)tran // Optionally, display an error here. } JFFStoreKitTransactionStateFailedError *error = [JFFStoreKitTransactionStateFailedError new]; + error.transaction = _transaction; [self unsubscribeFromObservervation]; - _handler(nil, error); + _finishCallback(nil, error); break; } default: diff --git a/lib/JFFStoreKit/JFFStoreKit/asyncAdapters/asyncSKPaymentQueue.m b/lib/JFFStoreKit/JFFStoreKit/asyncAdapters/asyncSKPaymentQueue.m index 7aeb30f..96e6823 100644 --- a/lib/JFFStoreKit/JFFStoreKit/asyncAdapters/asyncSKPaymentQueue.m +++ b/lib/JFFStoreKit/JFFStoreKit/asyncAdapters/asyncSKPaymentQueue.m @@ -16,13 +16,13 @@ @implementation JFFAsyncSKPaymentAdapter SKPaymentQueue *_queue; SKPayment *_payment; BOOL _addedToObservers; - JFFAsyncOperationInterfaceResultHandler _handler; + JFFDidFinishAsyncOperationCallback _finishCallback; } - (void)dealloc { [self unsubscribeFromObservervation]; - _handler = nil; + _finishCallback = nil; } - (void)doNothing:(id)objetc @@ -52,29 +52,37 @@ + (instancetype)newAsyncSKPaymentAdapterWithRequest:(SKPayment *)payment return result; } -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { if (![SKPaymentQueue canMakePayments]) { - handler(nil, [JFFStoreKitDisabledError new]); + finishCallback(nil, [JFFStoreKitDisabledError new]); return; } - _handler = [handler copy]; + _finishCallback = [finishCallback copy]; SKPaymentTransaction *transaction = [self ownPurchasedTransaction]; if (transaction) { [self unsubscribeFromObservervation]; - _handler(transaction, nil); + _finishCallback(transaction, nil); } else { [_queue addPayment:_payment]; } } +- (void)doTask:(JFFAsyncOperationHandlerTask)task +{ + NSParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); + + if (task == JFFAsyncOperationHandlerTaskUnSubscribe) + [self unsubscribeFromObservervation]; +} + - (SKPaymentTransaction *)ownPurchasedTransaction { //SKPayment @@ -100,7 +108,7 @@ - (SKPaymentTransaction *)ownTransactionForTransactions:(NSArray *)transactions - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { - if (!_handler) { + if (!_finishCallback) { return; } @@ -118,7 +126,7 @@ - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)tran case SKPaymentTransactionStatePurchased: { [self unsubscribeFromObservervation]; - _handler(transaction, nil); + _finishCallback(transaction, nil); break; } case SKPaymentTransactionStateFailed: @@ -129,13 +137,13 @@ - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)tran JFFStoreKitTransactionStateFailedError *error = [JFFStoreKitTransactionStateFailedError new]; error.transaction = transaction; [self unsubscribeFromObservervation]; - _handler(nil, error); + _finishCallback(nil, error); break; } case SKPaymentTransactionStateRestored: { [self unsubscribeFromObservervation]; - _handler(transaction, nil); + _finishCallback(transaction, nil); break; } default: diff --git a/lib/JFFStoreKit/JFFStoreKit/asyncAdapters/asyncSKPendingTransactions.m b/lib/JFFStoreKit/JFFStoreKit/asyncAdapters/asyncSKPendingTransactions.m index 233a35c..dc54896 100644 --- a/lib/JFFStoreKit/JFFStoreKit/asyncAdapters/asyncSKPendingTransactions.m +++ b/lib/JFFStoreKit/JFFStoreKit/asyncAdapters/asyncSKPendingTransactions.m @@ -2,8 +2,6 @@ #import "JFFStoreKitDisabledError.h" -#import - static NSString *const mergeObject = @"c8e5abce-1ab9-11e3-9a3b-f23c91aec05e"; @interface JFFAsyncSKPendingTransactions : NSObject < @@ -16,14 +14,13 @@ @implementation JFFAsyncSKPendingTransactions { SKPaymentQueue *_queue; BOOL _addedToObservers; - JFFAsyncOperationInterfaceResultHandler _handler; - JFFTimer *_timer; + JFFDidFinishAsyncOperationCallback _finishCallback; } - (void)dealloc { [self unsubscribeFromObservervation]; - _handler = nil; + _finishCallback = nil; } - (void)doNothing:(id)objetc @@ -52,46 +49,39 @@ + (instancetype)newAsyncSKPendingTransactions return result; } -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { if (![SKPaymentQueue canMakePayments]) { - handler(nil, [JFFStoreKitDisabledError new]); + finishCallback(nil, [JFFStoreKitDisabledError new]); return; } - _handler = [handler copy]; + _finishCallback = [finishCallback copy]; [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; +} + +- (void)doTask:(JFFAsyncOperationHandlerTask)task +{ + NSParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); - _timer = [JFFTimer new]; - - __weak JFFAsyncSKPendingTransactions *weakSelf = self; - - JFFScheduledBlock actionBlock = ^(JFFCancelScheduledBlock cancel) { - - [weakSelf finishWithTransactions:@[]]; - cancel(); - }; - - [_timer addBlock:actionBlock duration:0.2 leeway:0.02]; + if (task == JFFAsyncOperationHandlerTaskUnSubscribe) + [self unsubscribeFromObservervation]; } - (void)finishWithTransactions:(NSArray *)transactions { - transactions = [self pendingTransactionsForTransactions:transactions]?:@[]; + transactions = [self restoredTransactionsForTransactions:transactions]?:@[]; - if (_handler) - _handler(transactions, nil); - - _timer = nil; + if (_finishCallback) + _finishCallback(transactions, nil); } -- (NSArray *)pendingTransactionsForTransactions:(NSArray *)transactions +- (NSArray *)restoredTransactionsForTransactions:(NSArray *)transactions { NSArray *result = [transactions select:^BOOL(SKPaymentTransaction *transaction) { - return transaction.transactionState == SKPaymentTransactionStateRestored; }]; @@ -102,28 +92,24 @@ - (NSArray *)pendingTransactionsForTransactions:(NSArray *)transactions - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { - if (!_handler) { - return; - } - - //TODO fix workaround for IOS 6.0 - [self performSelector:@selector(doNothing:) withObject:self afterDelay:1.]; - - [self finishWithTransactions:transactions]; - [self unsubscribeFromObservervation]; } - (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { - //TODO finish here operation + JFFAsyncSKPendingTransactions *self_ = self; + + [self_ finishWithTransactions:queue.transactions]; + [self_ unsubscribeFromObservervation]; } - (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error { - if (_handler) - _handler(nil, error); + JFFAsyncSKPendingTransactions *self_ = self; + + if (_finishCallback) + _finishCallback(nil, error); - _timer = nil; + [self_ unsubscribeFromObservervation]; } @end diff --git a/lib/JFFStoreKit/JFFStoreKit/asyncAdapters/asyncSKProductRequest.m b/lib/JFFStoreKit/JFFStoreKit/asyncAdapters/asyncSKProductRequest.m index 58a0303..03711d4 100644 --- a/lib/JFFStoreKit/JFFStoreKit/asyncAdapters/asyncSKProductRequest.m +++ b/lib/JFFStoreKit/JFFStoreKit/asyncAdapters/asyncSKProductRequest.m @@ -15,7 +15,7 @@ @interface JFFAsyncSKProductsRequestAdapter : NSObject < @implementation JFFAsyncSKProductsRequestAdapter { SKProductsRequest *_request; - JFFAsyncOperationInterfaceResultHandler _handler; + JFFDidFinishAsyncOperationCallback _finishCallback; SKProductsResponse *_response; NSString *_productIdentifier; } @@ -36,18 +36,20 @@ - (instancetype)initWithProductIdentifier:(NSString *)productIdentifier return self; } -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { - _handler = [handler copy]; + _finishCallback = [finishCallback copy]; [_request start]; } -- (void)cancel:(BOOL)canceled +- (void)doTask:(JFFAsyncOperationHandlerTask)task { - if (canceled) + NSCParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); + + if (task == JFFAsyncOperationHandlerTaskCancel) [_request cancel]; } @@ -59,7 +61,6 @@ - (void)requestDidFinish:(SKRequest *)request if ([products hasElements]) { SKProduct *product = [products firstMatch:^BOOL(SKProduct *product) { - return [product.productIdentifier isEqualToString:_productIdentifier]; }]; @@ -69,7 +70,7 @@ - (void)requestDidFinish:(SKRequest *)request product = [products lastObject]; } - _handler(product, nil); + _finishCallback(product, nil); } else { NSString *invalidIdentifier = [_response.invalidProductIdentifiers lastObject]; @@ -79,14 +80,14 @@ - (void)requestDidFinish:(SKRequest *)request :[JFFStoreKitCanNoLoadProductError new]; error.productIdentifier = _productIdentifier; - _handler(nil, error); + _finishCallback(nil, error); } } - (void)request:(SKRequest *)request didFailWithError:(NSError *)error { error = error?:[[JFFSilentError alloc] initWithDescription:@"SKRequest no inet connection"]; - _handler(nil, error); + _finishCallback(nil, error); } #pragma mark SKProductsRequestDelegate diff --git a/lib/JFFStoreKit/JFFStoreKit/asyncPaymentOperations.h b/lib/JFFStoreKit/JFFStoreKit/asyncPaymentOperations.h index d963efe..80356d1 100644 --- a/lib/JFFStoreKit/JFFStoreKit/asyncPaymentOperations.h +++ b/lib/JFFStoreKit/JFFStoreKit/asyncPaymentOperations.h @@ -7,6 +7,7 @@ + (JFFAsyncOperation)purcheserWithProductIdentifier:(NSString *)productIdentifier srvCallback:(JFFAsyncOperationBinder)srvCallback; +//should return [srvResult, transaction] in doneCallback + (JFFAsyncOperation)purcheserWithProduct:(SKProduct *)product srvCallback:(JFFAsyncOperationBinder)srvCallback; diff --git a/lib/JFFStoreKit/JFFStoreKit/asyncPaymentOperations.m b/lib/JFFStoreKit/JFFStoreKit/asyncPaymentOperations.m index 7a8cf49..364eb0f 100644 --- a/lib/JFFStoreKit/JFFStoreKit/asyncPaymentOperations.m +++ b/lib/JFFStoreKit/JFFStoreKit/asyncPaymentOperations.m @@ -22,12 +22,13 @@ + (JFFAsyncOperation)purcheserWithProductIdentifier:(NSString *)productIdentifie nil); } +//should return [srvResult, transaction] in doneCallback + (JFFAsyncOperation)purcheserWithProduct:(SKProduct *)product srvCallback:(JFFAsyncOperationBinder)srvCallback { - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { SKPayment *payment = [SKPayment paymentWithProduct:product]; JFFAsyncOperation paymentloader = asyncOperationWithSKPayment(payment); @@ -39,7 +40,7 @@ + (JFFAsyncOperation)purcheserWithProduct:(SKProduct *)product JFFAsyncOperationBinder removeTransaction = ^JFFAsyncOperation(id srvResult) { JFFAsyncOperation finishTransaction = asyncOperationFinishTransaction(transaction); - return sequenceOfAsyncOperations(finishTransaction, asyncOperationWithResult(srvResult), nil); + return sequenceOfAsyncOperations(finishTransaction, asyncOperationWithResult(@[srvResult, transaction]), nil); }; return bindSequenceOfAsyncOperations(srvLoader, @@ -51,7 +52,7 @@ + (JFFAsyncOperation)purcheserWithProduct:(SKProduct *)product srvPaymentBinder, nil); - return loader(progressCallback, cancelCallback, doneCallback); + return loader(progressCallback, stateCallback, doneCallback); }; } diff --git a/lib/JFFTestTools/JFFTestTools.xcodeproj/project.pbxproj b/lib/JFFTestTools/JFFTestTools.xcodeproj/project.pbxproj index 1eba2fd..fd5c9b7 100644 --- a/lib/JFFTestTools/JFFTestTools.xcodeproj/project.pbxproj +++ b/lib/JFFTestTools/JFFTestTools.xcodeproj/project.pbxproj @@ -15,6 +15,8 @@ 1BE054441548273000270B58 /* GHAsyncTestCase+MainThreadTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BE054421548273000270B58 /* GHAsyncTestCase+MainThreadTests.m */; }; 1BE054B0154828F000270B58 /* NSObject+InstancesCount.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BE054AE154828EF00270B58 /* NSObject+InstancesCount.h */; }; 1BE054B1154828F000270B58 /* NSObject+InstancesCount.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BE054AF154828EF00270B58 /* NSObject+InstancesCount.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 4CDB8DD9182BBBEA00C5BFA3 /* JFFAsyncOperationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CDB8DD7182BBBEA00C5BFA3 /* JFFAsyncOperationManager.h */; }; + 4CDB8DDA182BBBEA00C5BFA3 /* JFFAsyncOperationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CDB8DD8182BBBEA00C5BFA3 /* JFFAsyncOperationManager.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -28,6 +30,8 @@ 1BE054421548273000270B58 /* GHAsyncTestCase+MainThreadTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GHAsyncTestCase+MainThreadTests.m"; sourceTree = ""; }; 1BE054AE154828EF00270B58 /* NSObject+InstancesCount.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+InstancesCount.h"; sourceTree = ""; }; 1BE054AF154828EF00270B58 /* NSObject+InstancesCount.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+InstancesCount.m"; sourceTree = ""; }; + 4CDB8DD7182BBBEA00C5BFA3 /* JFFAsyncOperationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFAsyncOperationManager.h; sourceTree = ""; }; + 4CDB8DD8182BBBEA00C5BFA3 /* JFFAsyncOperationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFAsyncOperationManager.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -70,6 +74,8 @@ 1BE05430154826DA00270B58 /* JFFTestTools */ = { isa = PBXGroup; children = ( + 4CDB8DD7182BBBEA00C5BFA3 /* JFFAsyncOperationManager.h */, + 4CDB8DD8182BBBEA00C5BFA3 /* JFFAsyncOperationManager.m */, 1BE054AE154828EF00270B58 /* NSObject+InstancesCount.h */, 1BE054AF154828EF00270B58 /* NSObject+InstancesCount.m */, 1BE054411548273000270B58 /* GHAsyncTestCase+MainThreadTests.h */, @@ -100,6 +106,7 @@ 1BE054431548273000270B58 /* GHAsyncTestCase+MainThreadTests.h in Headers */, 1BE054B0154828F000270B58 /* NSObject+InstancesCount.h in Headers */, 1B160AD7154BE3F200702B1D /* testTools.h in Headers */, + 4CDB8DD9182BBBEA00C5BFA3 /* JFFAsyncOperationManager.h in Headers */, 1B2D8B52154BF28100360296 /* JFFTestTools.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -155,6 +162,7 @@ buildActionMask = 2147483647; files = ( 1BE054441548273000270B58 /* GHAsyncTestCase+MainThreadTests.m in Sources */, + 4CDB8DDA182BBBEA00C5BFA3 /* JFFAsyncOperationManager.m in Sources */, 1BE054B1154828F000270B58 /* NSObject+InstancesCount.m in Sources */, 1B160AD8154BE3F200702B1D /* testTools.m in Sources */, ); diff --git a/lib/JFFTestTools/JFFTestTools/GHAsyncTestCase+MainThreadTests.h b/lib/JFFTestTools/JFFTestTools/GHAsyncTestCase+MainThreadTests.h index 988b231..db136bf 100755 --- a/lib/JFFTestTools/JFFTestTools/GHAsyncTestCase+MainThreadTests.h +++ b/lib/JFFTestTools/JFFTestTools/GHAsyncTestCase+MainThreadTests.h @@ -6,14 +6,14 @@ typedef void (^TestAsyncRequestBlock)(JFFSimpleBlock); //GHAsyncTestCase category @interface NSObject (MainThreadTests) -- (void)performAsyncRequestOnMainThreadWithBlock:(void(^)(JFFSimpleBlock))block +- (void)performAsyncRequestOnMainThreadWithBlock:(TestAsyncRequestBlock)block selector:(SEL)selector; -- (void)waitForeverForAsyncRequestOnMainThreadWithBlock:(void (^)(JFFSimpleBlock))block - selector:(SEL)selector; +-(void)waitForeverForAsyncRequestOnMainThreadWithBlock:(TestAsyncRequestBlock)block + selector:(SEL)selector; -- (void)performAsyncRequestOnMainThreadWithBlock:(void (^)(JFFSimpleBlock))block - selector:(SEL)selector - timeout:(NSTimeInterval)timeout; +-(void)performAsyncRequestOnMainThreadWithBlock:(TestAsyncRequestBlock)block + selector:(SEL)selector + timeout:(NSTimeInterval)timeout; @end diff --git a/lib/JFFTestTools/JFFTestTools/GHAsyncTestCase+MainThreadTests.m b/lib/JFFTestTools/JFFTestTools/GHAsyncTestCase+MainThreadTests.m index 36172c3..27d984c 100755 --- a/lib/JFFTestTools/JFFTestTools/GHAsyncTestCase+MainThreadTests.m +++ b/lib/JFFTestTools/JFFTestTools/GHAsyncTestCase+MainThreadTests.m @@ -33,24 +33,26 @@ - (void)performAsyncRequestOnMainThreadWithBlock:(void (^)(JFFSimpleBlock))block void (^didFinishCallback)(void) = ^void() { - objc_msgSend(self, - @selector(notify:forSelector:), - kGHUnitWaitStatusSuccess, - selector); + typedef void (*AlignMsgSendFunction)(id, SEL, NSInteger, SEL); + AlignMsgSendFunction alignFunction = (AlignMsgSendFunction)objc_msgSend; + alignFunction(self, @selector(notify:forSelector:), kGHUnitWaitStatusSuccess, selector); }; block([didFinishCallback copy]); } }; - objc_msgSend(self, @selector(prepare), nil); + { + typedef void (*AlignMsgSendFunction)(id, SEL); + AlignMsgSendFunction alignFunction = (AlignMsgSendFunction)objc_msgSend; + alignFunction(self, @selector(prepare)); + } dispatch_async(dispatch_get_main_queue(), autoreleaseBlock); - objc_msgSend(self, - @selector(waitForStatus:timeout:), - kGHUnitWaitStatusSuccess, - timeout); + typedef void (*AlignMsgSendFunction)(id, SEL, NSInteger, NSTimeInterval); + AlignMsgSendFunction alignFunction = (AlignMsgSendFunction)objc_msgSend; + alignFunction(self, @selector(waitForStatus:timeout:), kGHUnitWaitStatusSuccess, timeout); } + (void)load diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFAsyncOperationManager.h b/lib/JFFTestTools/JFFTestTools/JFFAsyncOperationManager.h similarity index 64% rename from test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFAsyncOperationManager.h rename to lib/JFFTestTools/JFFTestTools/JFFAsyncOperationManager.h index ee06bb4..ba4e982 100644 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFAsyncOperationManager.h +++ b/lib/JFFTestTools/JFFTestTools/JFFAsyncOperationManager.h @@ -2,16 +2,12 @@ #import -@class JFFCancelAsyncOperationBlockHolder; -@class JFFDidFinishAsyncOperationBlockHolder; - -typedef enum { - +typedef NS_ENUM(NSUInteger, JFFCancelAsyncOperationManagerType) +{ JFFDoNotCancelAsyncOperationManager, JFFCancelAsyncOperationManagerWithNoFlag, JFFCancelAsyncOperationManagerWithYesFlag - -} JFFCancelAsyncOperationManagerType; +}; @interface JFFAsyncOperationManager : NSObject @@ -20,13 +16,13 @@ typedef enum { @property (nonatomic) JFFCancelAsyncOperationManagerType cancelAtLoading; @property (nonatomic, copy, readonly) JFFAsyncOperation loader; -@property (nonatomic, readonly) JFFDidFinishAsyncOperationBlockHolder* loaderFinishBlock; -@property (nonatomic, readonly) JFFCancelAsyncOperationBlockHolder* loaderCancelBlock; +@property (nonatomic, copy, readonly) JFFDidFinishAsyncOperationCallback loaderFinishBlock; +@property (nonatomic, copy, readonly) JFFAsyncOperationHandler loaderHandlerBlock; @property (nonatomic, readonly) NSUInteger loadingCount; @property (nonatomic, readonly) BOOL finished; @property (nonatomic, readonly) BOOL canceled; -@property (nonatomic, readonly) BOOL cancelFlag; +@property (nonatomic, readonly) JFFAsyncOperationHandlerTask lastHandleFlag; - (void)clear; diff --git a/lib/JFFTestTools/JFFTestTools/JFFAsyncOperationManager.m b/lib/JFFTestTools/JFFTestTools/JFFAsyncOperationManager.m new file mode 100644 index 0000000..f1d565b --- /dev/null +++ b/lib/JFFTestTools/JFFTestTools/JFFAsyncOperationManager.m @@ -0,0 +1,105 @@ +#import "JFFAsyncOperationManager.h" + +#import +#import + +#import + +@interface JFFAsyncOperationManager () + +@property (nonatomic, copy) JFFDidFinishAsyncOperationCallback loaderFinishBlock; +@property (nonatomic, copy) JFFAsyncOperationHandler loaderHandlerBlock; + +@property (nonatomic) NSUInteger loadingCount; +@property (nonatomic) BOOL finished; +@property (nonatomic) BOOL canceled; +@property (nonatomic) JFFAsyncOperationHandlerTask lastHandleFlag; + +@end + +@implementation JFFAsyncOperationManager + +- (instancetype)init +{ + self = [super init]; + + if (self) { + + _lastHandleFlag = JFFAsyncOperationHandlerTaskUndefined; + } + + return self; +} + +- (void)clear +{ + _loaderFinishBlock = nil; + _loaderHandlerBlock = nil; + _finished = NO; + _loadingCount = 0; + + _lastHandleFlag = JFFAsyncOperationHandlerTaskUndefined; +} + +- (JFFAsyncOperation)loader +{ + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { + + __weak JFFAsyncOperationManager *weakSelf = self; + + self.loadingCount += 1; + + if (self.cancelAtLoading > JFFDoNotCancelAsyncOperationManager) { + + self.canceled = YES; + if (doneCallback) { + + JFFAsyncOperationHandlerTask task = (self.cancelAtLoading == JFFCancelAsyncOperationManagerWithNoFlag) + ?JFFAsyncOperationHandlerTaskUnSubscribe + :JFFAsyncOperationHandlerTaskCancel; + NSError *error = [JFFAsyncOperationAbstractFinishError newAsyncOperationAbstractFinishErrorWithHandlerTask:task]; + doneCallback(nil, error); + } + return JFFStubHandlerAsyncOperationBlock; + } + + doneCallback = [doneCallback copy]; + + self.loaderFinishBlock = ^(id result, NSError *error) { + + weakSelf.loaderFinishBlock = nil; + weakSelf.loaderHandlerBlock = nil; + weakSelf.finished = YES; + if (doneCallback) + doneCallback(result, error); + }; + + if (self.finishAtLoading || self.failAtLoading) { + if (self.finishAtLoading) + self.loaderFinishBlock([NSNull null], nil); + else + self.loaderFinishBlock(nil, [JFFError newErrorWithDescription:@"some error"]); + return JFFStubHandlerAsyncOperationBlock; + } + + stateCallback = [stateCallback copy]; + self.loaderHandlerBlock = ^(JFFAsyncOperationHandlerTask task) { + + if (task <= JFFAsyncOperationHandlerTaskCancel) { + weakSelf.loaderFinishBlock = nil; + weakSelf.loaderHandlerBlock = nil; + } + + weakSelf.canceled = (task <= JFFAsyncOperationHandlerTaskCancel); + weakSelf.lastHandleFlag = task; + + processHandlerFlag(task, stateCallback, doneCallback); + }; + + return self.loaderHandlerBlock; + }; +} + +@end diff --git a/lib/JFFTestTools/JFFTestTools/JFFTestTools.h b/lib/JFFTestTools/JFFTestTools/JFFTestTools.h index 697f5f8..b3a495d 100755 --- a/lib/JFFTestTools/JFFTestTools/JFFTestTools.h +++ b/lib/JFFTestTools/JFFTestTools/JFFTestTools.h @@ -3,6 +3,7 @@ #import #import +#import #import #endif //JFF_TEST_TOOLS_HEADER_INCLUDED diff --git a/lib/JFFUI/AlertView/Detail/JFFWaitAlertView.mm b/lib/JFFUI/AlertView/Detail/JFFWaitAlertView.mm index 07c2abe..3894965 100644 --- a/lib/JFFUI/AlertView/Detail/JFFWaitAlertView.mm +++ b/lib/JFFUI/AlertView/Detail/JFFWaitAlertView.mm @@ -23,18 +23,21 @@ - (void)showActivityIndicatorView #pragma mark UIAlertViewDelegate -- (void)willPresentAlertView:(UIAlertView *)alertView_ +- (void)willPresentAlertView:(UIAlertView *)alertView { - SEL selector_ = @selector( willPresentAlertView: ); - if ( [ [ self superclass ] hasInstanceMethodWithSelector: selector_ ] ) - { - struct objc_super superTarget_; - superTarget_.receiver = self; - superTarget_.super_class = [ self superclass ]; - objc_msgSendSuper( &superTarget_, selector_, alertView_ ); + SEL selector = @selector(willPresentAlertView:); + if ([[self superclass] hasInstanceMethodWithSelector:selector]) { + + struct objc_super superTarget; + superTarget.receiver = self; + superTarget.super_class = [self superclass]; + + typedef void (*AlignMsgSendFunction)(struct objc_super *super, SEL, UIView *); + AlignMsgSendFunction alignFunction = (AlignMsgSendFunction)objc_msgSendSuper; + alignFunction(&superTarget, selector, alertView); } - [ self showActivityIndicatorView ]; + [self showActivityIndicatorView]; } @end diff --git a/lib/JFFUI/AlertView/NSError+Alert.m b/lib/JFFUI/AlertView/NSError+Alert.m index 26b4ed9..28c4473 100755 --- a/lib/JFFUI/AlertView/NSError+Alert.m +++ b/lib/JFFUI/AlertView/NSError+Alert.m @@ -2,6 +2,9 @@ #import "JFFAlertView.h" +#import +#import + @implementation NSError (Alert) - (void)showAlertWithTitle:(NSString *)title @@ -23,3 +26,41 @@ - (void)showExclusiveErrorAlert } @end + +@implementation JFFAsyncOpFinishedByCancellationError (Alert) + +- (void)showAlertWithTitle:(NSString *)title +{ + [self writeErrorWithJFFLogger]; +} + +- (void)showErrorAlert +{ + [self writeErrorWithJFFLogger]; +} + +- (void)showExclusiveErrorAlert +{ + [self writeErrorWithJFFLogger]; +} + +@end + +@implementation JFFAsyncOpFinishedByUnsubscriptionError (Alert) + +- (void)showAlertWithTitle:(NSString *)title +{ + [self writeErrorWithJFFLogger]; +} + +- (void)showErrorAlert +{ + [self writeErrorWithJFFLogger]; +} + +- (void)showExclusiveErrorAlert +{ + [self writeErrorWithJFFLogger]; +} + +@end diff --git a/lib/JFFUI/Categories/JFFAlertView+Async.m b/lib/JFFUI/Categories/JFFAlertView+Async.m index 4ebd060..dbe08a9 100644 --- a/lib/JFFUI/Categories/JFFAlertView+Async.m +++ b/lib/JFFUI/Categories/JFFAlertView+Async.m @@ -11,29 +11,30 @@ @implementation JFFShowAlerLoader JFFAlertView *_alertView; } -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { if (!_alertView) { - if (cancelHandler) - cancelHandler(YES); + if (finishCallback) + finishCallback(nil, [JFFAsyncOpFinishedByCancellationError new]); return; } _alertView.didDismissHandler = ^() { - if (handler) - handler([NSNull new], nil); + if (finishCallback) + finishCallback([NSNull new], nil); }; [_alertView show]; } -- (void)cancel:(BOOL)canceled +- (void)doTask:(JFFAsyncOperationHandlerTask)task { - if (canceled) + NSCParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); + if (task == JFFAsyncOperationHandlerTaskCancel) [_alertView forceDismiss]; } diff --git a/lib/JFFUI/Categories/UIApplication+OpenApplicationAsyncOp.m b/lib/JFFUI/Categories/UIApplication+OpenApplicationAsyncOp.m index 7880424..df59521 100644 --- a/lib/JFFUI/Categories/UIApplication+OpenApplicationAsyncOp.m +++ b/lib/JFFUI/Categories/UIApplication+OpenApplicationAsyncOp.m @@ -16,25 +16,26 @@ @interface JFFOpenApplicationWithURLDelegateProxy : NSObject< @implementation JFFOpenApplicationWithURLDelegateProxy { - JFFAsyncOperationInterfaceResultHandler _handler; + JFFDidFinishAsyncOperationCallback _finishCallback; @public NSURL *_url; UIApplication *_application; } -- (void)asyncOperationWithResultHandler:(JFFAsyncOperationInterfaceResultHandler)handler - cancelHandler:(JFFAsyncOperationInterfaceCancelHandler)cancelHandler - progressHandler:(JFFAsyncOperationInterfaceProgressHandler)progress +- (void)asyncOperationWithResultCallback:(JFFDidFinishAsyncOperationCallback)finishCallback + handlerCallback:(JFFAsyncOperationChangeStateCallback)handlerCallback + progressCallback:(JFFAsyncOperationProgressCallback)progressCallback { [_application addDelegateProxy:self delegateName:delegateName]; - _handler = [handler copy]; + _finishCallback = [finishCallback copy]; [_application openURL:_url]; } -- (void)cancel:(BOOL)canceled +- (void)doTask:(JFFAsyncOperationHandlerTask)task { + NSCParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); [_application removeDelegateProxy:self delegateName:delegateName]; } @@ -43,9 +44,9 @@ - (BOOL)finishWithURL:(NSURL *)url [_application removeDelegateProxy:self delegateName:delegateName]; if (url) { - _handler(url, nil); + _finishCallback(url, nil); } else { - _handler(nil, [JFFOpenApplicationError new]); + _finishCallback(nil, [JFFOpenApplicationError new]); } return YES; diff --git a/lib/JFFUtils/Categories/UIColor+ColorForHex.h b/lib/JFFUI/Categories/UIColor+ColorForHex.h similarity index 100% rename from lib/JFFUtils/Categories/UIColor+ColorForHex.h rename to lib/JFFUI/Categories/UIColor+ColorForHex.h diff --git a/lib/JFFUtils/Categories/UIColor+ColorForHex.m b/lib/JFFUI/Categories/UIColor+ColorForHex.m similarity index 96% rename from lib/JFFUtils/Categories/UIColor+ColorForHex.m rename to lib/JFFUI/Categories/UIColor+ColorForHex.m index 45e4711..55404b6 100644 --- a/lib/JFFUtils/Categories/UIColor+ColorForHex.m +++ b/lib/JFFUI/Categories/UIColor+ColorForHex.m @@ -1,6 +1,6 @@ #import "UIColor+ColorForHex.h" -#import "NSString+Trimm.h" +//#import //source: http://iphonedevelopertips.com/general/using-nsscanner-to-convert-hex-to-rgb-color.html @implementation UIColor (ColorForHex) diff --git a/lib/JFFUtils/Categories/UIDevice+PlatformName.h b/lib/JFFUI/Categories/UIDevice+PlatformName.h similarity index 100% rename from lib/JFFUtils/Categories/UIDevice+PlatformName.h rename to lib/JFFUI/Categories/UIDevice+PlatformName.h diff --git a/lib/JFFUtils/Categories/UIDevice+PlatformName.m b/lib/JFFUI/Categories/UIDevice+PlatformName.m similarity index 100% rename from lib/JFFUtils/Categories/UIDevice+PlatformName.m rename to lib/JFFUI/Categories/UIDevice+PlatformName.m diff --git a/lib/JFFUI/JFFDialogProtocol.h b/lib/JFFUI/JFFDialogProtocol.h index f8bec06..6e99b06 100644 --- a/lib/JFFUI/JFFDialogProtocol.h +++ b/lib/JFFUI/JFFDialogProtocol.h @@ -4,7 +4,7 @@ typedef void (^JFFCompleteDialogCallbackBlock)(id result, NSError *error, BOOL i @protocol JFFDialogProtocol -@property (copy, nonatomic) JFFCompleteDialogCallbackBlock onCompleteDialogBlock; +@property (copy, nonatomic) JFFCompleteDialogCallbackBlock onCompleteDialogBlock;//can be called several times @required - (void)completeDialogWithResult:(id)result error:(NSError *)error isCanceled:(BOOL)isCancaled; diff --git a/lib/JFFUI/JFFUI.h b/lib/JFFUI/JFFUI.h index 8e45b1b..1d7d9a6 100644 --- a/lib/JFFUI/JFFUI.h +++ b/lib/JFFUI/JFFUI.h @@ -41,8 +41,8 @@ //Categories #import #import -#import #import +#import #import #import diff --git a/lib/JFFUI/JFFUI.xcodeproj/project.pbxproj b/lib/JFFUI/JFFUI.xcodeproj/project.pbxproj index 61872f1..721bd5c 100644 --- a/lib/JFFUI/JFFUI.xcodeproj/project.pbxproj +++ b/lib/JFFUI/JFFUI.xcodeproj/project.pbxproj @@ -33,6 +33,10 @@ 1BD3616C1455A2F80036F786 /* JFFPageSliderDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BD3616B1455A2F80036F786 /* JFFPageSliderDelegate.h */; }; 1BE053B715480F4400270B58 /* JFFActionSheetsContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BE053B515480F4400270B58 /* JFFActionSheetsContainer.h */; }; 1BE053B815480F4400270B58 /* JFFActionSheetsContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BE053B615480F4400270B58 /* JFFActionSheetsContainer.m */; }; + 4C1A0EFC182572FB0020FBF6 /* UIColor+ColorForHex.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C1A0EFA182572FB0020FBF6 /* UIColor+ColorForHex.h */; }; + 4C1A0EFD182572FB0020FBF6 /* UIColor+ColorForHex.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1A0EFB182572FB0020FBF6 /* UIColor+ColorForHex.m */; }; + 4C1A0F36182574A70020FBF6 /* UIDevice+PlatformName.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C1A0F34182574A70020FBF6 /* UIDevice+PlatformName.h */; }; + 4C1A0F37182574A70020FBF6 /* UIDevice+PlatformName.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1A0F35182574A70020FBF6 /* UIDevice+PlatformName.m */; }; 4C21FA7D16EF4F59005C4E57 /* JFFStripeView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C21FA7916EF4F59005C4E57 /* JFFStripeView.h */; }; 4C21FA7E16EF4F59005C4E57 /* JFFStripeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C21FA7A16EF4F59005C4E57 /* JFFStripeView.m */; }; 4C21FA7F16EF4F59005C4E57 /* JFFStripeViewDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C21FA7B16EF4F59005C4E57 /* JFFStripeViewDelegate.h */; }; @@ -148,6 +152,10 @@ 1BD3616B1455A2F80036F786 /* JFFPageSliderDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFPageSliderDelegate.h; sourceTree = ""; }; 1BE053B515480F4400270B58 /* JFFActionSheetsContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFActionSheetsContainer.h; sourceTree = ""; }; 1BE053B615480F4400270B58 /* JFFActionSheetsContainer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFActionSheetsContainer.m; sourceTree = ""; }; + 4C1A0EFA182572FB0020FBF6 /* UIColor+ColorForHex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+ColorForHex.h"; sourceTree = ""; }; + 4C1A0EFB182572FB0020FBF6 /* UIColor+ColorForHex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+ColorForHex.m"; sourceTree = ""; }; + 4C1A0F34182574A70020FBF6 /* UIDevice+PlatformName.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIDevice+PlatformName.h"; sourceTree = ""; }; + 4C1A0F35182574A70020FBF6 /* UIDevice+PlatformName.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIDevice+PlatformName.m"; sourceTree = ""; }; 4C21FA7916EF4F59005C4E57 /* JFFStripeView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFStripeView.h; sourceTree = ""; }; 4C21FA7A16EF4F59005C4E57 /* JFFStripeView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFStripeView.m; sourceTree = ""; }; 4C21FA7B16EF4F59005C4E57 /* JFFStripeViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFStripeViewDelegate.h; sourceTree = ""; }; @@ -364,6 +372,10 @@ 4C2CFD9C1754A4FA00E87F22 /* UIApplication+OpenApplicationAsyncOp.m */, 4C8973911761F33C00E24F7B /* UIWebView+UserAgent.h */, 4C8973921761F33C00E24F7B /* UIWebView+UserAgent.m */, + 4C1A0EFA182572FB0020FBF6 /* UIColor+ColorForHex.h */, + 4C1A0EFB182572FB0020FBF6 /* UIColor+ColorForHex.m */, + 4C1A0F34182574A70020FBF6 /* UIDevice+PlatformName.h */, + 4C1A0F35182574A70020FBF6 /* UIDevice+PlatformName.m */, ); path = Categories; sourceTree = ""; @@ -502,6 +514,7 @@ 1B29555F143DCB7300532BD7 /* UITableView+WithinUpdates.h in Headers */, 1BD361691455A0630036F786 /* JFFPageSlider.h in Headers */, 1BD3616C1455A2F80036F786 /* JFFPageSliderDelegate.h in Headers */, + 4C1A0F36182574A70020FBF6 /* UIDevice+PlatformName.h in Headers */, 1B3A3854147683E9007D8C10 /* UIView+AllSubviews.h in Headers */, 1B5E1AD214D0203B0075049A /* UIViewController+PresentTopViewController.h in Headers */, 1BE053B715480F4400270B58 /* JFFActionSheetsContainer.h in Headers */, @@ -526,6 +539,7 @@ 4CBBA1A917662275007317E6 /* JFFCameraFlashModeType.h in Headers */, 4CBBA1AA17662275007317E6 /* JFFPhotoCamera.h in Headers */, 4CBBA1AC17662275007317E6 /* JFFPhotoCameraType.h in Headers */, + 4C1A0EFC182572FB0020FBF6 /* UIColor+ColorForHex.h in Headers */, 4CB4C1A31770530C00F275BC /* UIImage+ScaleToSize.h in Headers */, 4CB4C1A71770535700F275BC /* UIImage+FixOrientation.h in Headers */, 4CB4C1AF1770539900F275BC /* UIImage+ImageWithColor.h in Headers */, @@ -577,7 +591,7 @@ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0510; }; buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "JFFUI" */; compatibilityVersion = "Xcode 3.2"; @@ -628,10 +642,12 @@ 655E9DB91392E8C00074BD61 /* JFFAlertButton.m in Sources */, 655E9DBB1392E8C00074BD61 /* JFFAlertView.m in Sources */, 655E9DBD1392E8C00074BD61 /* NSError+Alert.m in Sources */, + 4C1A0EFD182572FB0020FBF6 /* UIColor+ColorForHex.m in Sources */, 8D996F19139F5D370075A325 /* JFFActionSheet.m in Sources */, 8D996F1F139F61200075A325 /* NSObject+JFFAlertButton.m in Sources */, 4C4E8EA7180BFA4B002D8A7B /* UITableView+CellsSelections.m in Sources */, 1B7F58431435BDC000FF06EC /* UIWebView+HideWhenLoading.m in Sources */, + 4C1A0F37182574A70020FBF6 /* UIDevice+PlatformName.m in Sources */, 1B7F58981435D53300FF06EC /* UIView+AddSubviewAndScale.m in Sources */, 1B7F589C1435D58000FF06EC /* UIView+AnimationWithBlocks.m in Sources */, 1B49CFA8143C6D3500E8AACE /* UIWebViewNewFeaturesRuntime.m in Sources */, @@ -683,7 +699,6 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = JFFUI_Prefix.pch; INSTALL_PATH = /usr/local/lib; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = JFFUI; SKIP_INSTALL = YES; }; @@ -699,7 +714,6 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = JFFUI_Prefix.pch; INSTALL_PATH = /usr/local/lib; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = JFFUI; SKIP_INSTALL = YES; }; @@ -709,6 +723,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; GCC_OPTIMIZATION_LEVEL = 0; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; @@ -719,8 +734,9 @@ ../, "../../lib-third-party/libturbojpeg-ios", ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; + ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; }; @@ -730,6 +746,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; @@ -739,7 +756,7 @@ ../, "../../lib-third-party/libturbojpeg-ios", ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; @@ -750,7 +767,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; COPY_PHASE_STRIP = NO; DSTROOT = /tmp/JFFUI.dst; @@ -772,7 +788,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/JFFUI.dst; GCC_MODEL_TUNING = G5; diff --git a/lib/JFFUI/JFFUI_Prefix.pch b/lib/JFFUI/JFFUI_Prefix.pch index 2df276a..4f58906 100755 --- a/lib/JFFUI/JFFUI_Prefix.pch +++ b/lib/JFFUI/JFFUI_Prefix.pch @@ -2,6 +2,10 @@ // Prefix header for all source files of the 'CocoaTouchStaticLibrary' target in the 'CocoaTouchStaticLibrary' project. // +#ifdef __cplusplus + #include +#endif + #ifdef __OBJC__ #import #import diff --git a/lib/JFFUI/PhotoCamera/JFFPhotoCamera.m b/lib/JFFUI/PhotoCamera/JFFPhotoCamera.m index 0bc4761..c05b93c 100644 --- a/lib/JFFUI/PhotoCamera/JFFPhotoCamera.m +++ b/lib/JFFUI/PhotoCamera/JFFPhotoCamera.m @@ -169,23 +169,23 @@ - (void)setSessionPreset:(NSString *)sessionPreset - (JFFAVCaptureVideoOrientation)videoOrientation { AVCaptureConnection *videoConnection = [self videoConnectionFromImageOutput:_camImageOutput]; - return videoConnection.videoOrientation; + return (JFFAVCaptureVideoOrientation)videoConnection.videoOrientation; } - (void)setVideoOrientation:(JFFAVCaptureVideoOrientation)videoOrientation { AVCaptureConnection *videoConnection = [self videoConnectionFromImageOutput:_camImageOutput]; - videoConnection.videoOrientation = videoOrientation; + videoConnection.videoOrientation = (AVCaptureVideoOrientation)videoOrientation; } - (JFFCameraFlashModeType)flashMode { //TODO check is front camera return _backCameraDevice.flashMode == AVCaptureFlashModeAuto - ? JFFCameraFlashModeAuto - : _backCameraDevice.flashMode == AVCaptureFlashModeOn - ? JFFCameraFlashModeOn - : JFFCameraFlashModeOff; + ?JFFCameraFlashModeAuto + :_backCameraDevice.flashMode == AVCaptureFlashModeOn + ?JFFCameraFlashModeOn + :JFFCameraFlashModeOff; } - (void)setFlashMode:(JFFCameraFlashModeType)flashMode diff --git a/lib/JFFUI/StripeView/JFFPageSlider.m b/lib/JFFUI/StripeView/JFFPageSlider.m index e36df87..ac5b5a7 100644 --- a/lib/JFFUI/StripeView/JFFPageSlider.m +++ b/lib/JFFUI/StripeView/JFFPageSlider.m @@ -18,7 +18,7 @@ @implementation JFFPageSlider { NSInteger _previousIndex; NSInteger _cachedNumberOfElements; - NSRange _previousVisiableIndexesRange; + NSRange _previousVisibleIndexesRange; } - (void)dealloc @@ -54,8 +54,8 @@ - (void)initialize _scrollView.scrollEnabled = YES; [self addSubviewAndScale:_scrollView]; - NSRange range_ = { 0, 1 }; - _previousVisiableIndexesRange = range_; + NSRange range = { 0, 1 }; + _previousVisibleIndexesRange = range; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveMemoryWarning:) @@ -229,11 +229,11 @@ - (void)slideToIndex:( NSInteger )index_ [ self slideToIndex: index_ animated: NO ]; } -- (NSRange)visiableIndexesRange +- (NSRange)visibleIndexesRange { if (_scrollView.bounds.size.width == 0) { NSLog(@"[!!!ERROR!!!] division by zero"); - return _previousVisiableIndexesRange; + return _previousVisibleIndexesRange; } NSInteger firstIndex = floorf( _scrollView.contentOffset.x / _scrollView.bounds.size.width ) + _firstIndex; @@ -242,9 +242,9 @@ - (NSRange)visiableIndexesRange firstIndex = firstIndex > 0 ?: 0; - NSRange range_ = { firstIndex, lastIndex - firstIndex + 1 }; - _previousVisiableIndexesRange = range_; - return _previousVisiableIndexesRange; + NSRange range = { firstIndex, lastIndex - firstIndex + 1 }; + _previousVisibleIndexesRange = range; + return _previousVisibleIndexesRange; } - (NSInteger)lastIndex @@ -300,8 +300,8 @@ - (void)pushBackElement - (void)scrollViewDidScroll:(UIScrollView *)scrollView { - NSRange previuosRange = _previousVisiableIndexesRange; - NSRange indexRange = [self visiableIndexesRange]; + NSRange previuosRange = _previousVisibleIndexesRange; + NSRange indexRange = [self visibleIndexesRange]; if (NSEqualRanges(previuosRange, indexRange)) return; diff --git a/lib/JFFUI/UIViewController/UIViewController+Dialog.m b/lib/JFFUI/UIViewController/UIViewController+Dialog.m index ef3a8c8..def060c 100644 --- a/lib/JFFUI/UIViewController/UIViewController+Dialog.m +++ b/lib/JFFUI/UIViewController/UIViewController+Dialog.m @@ -29,9 +29,9 @@ - (void)cancelDialog - (void)completeDialogWithResult:(id)result error:(NSError *)error isCanceled:(BOOL)isCancaled { JFFCompleteDialogCallbackBlock onCompleteDialogBlock = self.onCompleteDialogBlock; - if (onCompleteDialogBlock) { + + if (onCompleteDialogBlock) onCompleteDialogBlock(result, error, isCancaled); - } } @end diff --git a/lib/JFFUtils/Errors/NSError+WriteErrorToNSLog.m b/lib/JFFUtils/Errors/NSError+WriteErrorToNSLog.m index 365c03b..0a86e41 100644 --- a/lib/JFFUtils/Errors/NSError+WriteErrorToNSLog.m +++ b/lib/JFFUtils/Errors/NSError+WriteErrorToNSLog.m @@ -15,7 +15,7 @@ - (NSString *)errorLogDescription - (void)writeErrorToNSLog { - NSLog(@"%@", [self errorLogDescription]); + NSLog(@"only log - %@", [self errorLogDescription]); } - (void)writeErrorWithJFFLogger diff --git a/lib/JFFUtils/JFFMutableAssignArray.h b/lib/JFFUtils/JFFMutableAssignArray.h index 513ae5f..47a4e0b 100644 --- a/lib/JFFUtils/JFFMutableAssignArray.h +++ b/lib/JFFUtils/JFFMutableAssignArray.h @@ -14,6 +14,8 @@ - (void)removeObjectAtIndex:(NSUInteger)index; - (void)removeAllObjects; +- (id)objectAtIndexedSubscript:(NSUInteger)idx; + - (NSUInteger)indexOfObject:(id)object; - (NSUInteger)count; diff --git a/lib/JFFUtils/JFFMutableAssignArray.m b/lib/JFFUtils/JFFMutableAssignArray.m index d027fb9..b76eebf 100644 --- a/lib/JFFUtils/JFFMutableAssignArray.m +++ b/lib/JFFUtils/JFFMutableAssignArray.m @@ -108,6 +108,12 @@ - (void)removeAllObjects [_mutableArray removeAllObjects]; } +- (id)objectAtIndexedSubscript:(NSUInteger)idx +{ + JFFAutoRemoveAssignProxy *proxy = _mutableArray[idx]; + return proxy.target; +} + - (NSUInteger)indexOfObject:(id)object { NSUInteger index = [_mutableArray firstIndexOfObjectMatch:^BOOL(id element) { diff --git a/lib/JFFUtils/JFFUtils.h b/lib/JFFUtils/JFFUtils.h index 5a54793..c2b95af 100644 --- a/lib/JFFUtils/JFFUtils.h +++ b/lib/JFFUtils/JFFUtils.h @@ -57,9 +57,7 @@ #import #import -#import #import -#import #import #import diff --git a/lib/JFFUtils/JFFUtils.xcodeproj/project.pbxproj b/lib/JFFUtils/JFFUtils.xcodeproj/project.pbxproj index f3acdae..a6bf4a2 100644 --- a/lib/JFFUtils/JFFUtils.xcodeproj/project.pbxproj +++ b/lib/JFFUtils/JFFUtils.xcodeproj/project.pbxproj @@ -75,6 +75,71 @@ 37497BD71600971C00AF0C29 /* NSDictionary+ValueWithType.m in Sources */ = {isa = PBXBuildFile; fileRef = 37497BCF1600971C00AF0C29 /* NSDictionary+ValueWithType.m */; }; 37805592164D432700459BA7 /* NSLocale+CurrentInterfaceLanguageCode.h in Headers */ = {isa = PBXBuildFile; fileRef = 37805590164D432700459BA7 /* NSLocale+CurrentInterfaceLanguageCode.h */; }; 37805593164D432700459BA7 /* NSLocale+CurrentInterfaceLanguageCode.m in Sources */ = {isa = PBXBuildFile; fileRef = 37805591164D432700459BA7 /* NSLocale+CurrentInterfaceLanguageCode.m */; }; + 4C069435182D3BAA0099BB66 /* JFFMemoryMgmt.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B909B7C14EA918800B19283 /* JFFMemoryMgmt.h */; }; + 4C069436182D3BAB0099BB66 /* JFFMemoryMgmt.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B909B7C14EA918800B19283 /* JFFMemoryMgmt.h */; }; + 4C069437182D3BAC0099BB66 /* JFFMemoryMgmt.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B909B7C14EA918800B19283 /* JFFMemoryMgmt.h */; }; + 4C069438182D3BC60099BB66 /* JFFMemoryMgmt.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B909B7D14EA918800B19283 /* JFFMemoryMgmt.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 4C06950B182D41BD0099BB66 /* NSString+CPlusPlus.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7E44D670158F189F00A2C11E /* NSString+CPlusPlus.mm */; }; + 4C06950C182D41BD0099BB66 /* NSString+CPlusPlus.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7E44D670158F189F00A2C11E /* NSString+CPlusPlus.mm */; }; + 4C06950D182D41BE0099BB66 /* NSString+CPlusPlus.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7E44D670158F189F00A2C11E /* NSString+CPlusPlus.mm */; }; + 4C06950E182D41BE0099BB66 /* NSString+CPlusPlus.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7E44D670158F189F00A2C11E /* NSString+CPlusPlus.mm */; }; + 4C06950F182D41BE0099BB66 /* NSString+CPlusPlus.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7E44D670158F189F00A2C11E /* NSString+CPlusPlus.mm */; }; + 4C1A0E90182572A50020FBF6 /* JFFSilentError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6DFB1617184A0600D86975 /* JFFSilentError.m */; }; + 4C1A0E91182572A50020FBF6 /* NSError+SetToPointer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC01A9917438582003F1C88 /* NSError+SetToPointer.m */; }; + 4C1A0E92182572A50020FBF6 /* NSError+WriteErrorToNSLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC01A911743836C003F1C88 /* NSError+WriteErrorToNSLog.m */; }; + 4C1A0E93182572A50020FBF6 /* NSError+IsNetworkError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC01A9517438408003F1C88 /* NSError+IsNetworkError.m */; }; + 4C1A0E94182572A50020FBF6 /* NSDecimalNumber+Increment.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBEB17058D4200BD49E8 /* NSDecimalNumber+Increment.m */; }; + 4C1A0E96182572A50020FBF6 /* NSData+ToString.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBF717058DB100BD49E8 /* NSData+ToString.m */; }; + 4C1A0E97182572A50020FBF6 /* NSNumber+FSStorable.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBFB17058DCF00BD49E8 /* NSNumber+FSStorable.m */; }; + 4C1A0E98182572A50020FBF6 /* NSDateFormatter+MultiThreading.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBFF17058DFE00BD49E8 /* NSDateFormatter+MultiThreading.m */; }; + 4C1A0E9A182572A50020FBF6 /* JFFLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = CEC70F10169DBA8B006D63DE /* JFFLogger.m */; }; + 4C1A0E9B182572A50020FBF6 /* NSLocale+CurrentInterfaceLanguageCode.m in Sources */ = {isa = PBXBuildFile; fileRef = 37805591164D432700459BA7 /* NSLocale+CurrentInterfaceLanguageCode.m */; }; + 4C1A0E9C182572A50020FBF6 /* NSSet+BlocksAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57FBB71611EFFF00124D90 /* NSSet+BlocksAdditions.m */; }; + 4C1A0E9D182572A50020FBF6 /* NSMutableSet+StorableSet.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57FBBC1611F0BF00124D90 /* NSMutableSet+StorableSet.m */; }; + 4C1A0E9E182572A50020FBF6 /* NSOrderedSet+BlocksAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE998C471626B988002D39FD /* NSOrderedSet+BlocksAdditions.m */; }; + 4C1A0E9F182572A50020FBF6 /* NSOrderedSet+NoThrowObjectAtIndex.m in Sources */ = {isa = PBXBuildFile; fileRef = 37063C6615FE0C5700B4B059 /* NSOrderedSet+NoThrowObjectAtIndex.m */; }; + 4C1A0EA0182572A60020FBF6 /* JFFSilentError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6DFB1617184A0600D86975 /* JFFSilentError.m */; }; + 4C1A0EA1182572A60020FBF6 /* NSError+SetToPointer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC01A9917438582003F1C88 /* NSError+SetToPointer.m */; }; + 4C1A0EA2182572A60020FBF6 /* NSError+WriteErrorToNSLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC01A911743836C003F1C88 /* NSError+WriteErrorToNSLog.m */; }; + 4C1A0EA3182572A60020FBF6 /* NSError+IsNetworkError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC01A9517438408003F1C88 /* NSError+IsNetworkError.m */; }; + 4C1A0EA4182572A60020FBF6 /* NSDecimalNumber+Increment.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBEB17058D4200BD49E8 /* NSDecimalNumber+Increment.m */; }; + 4C1A0EA6182572A60020FBF6 /* NSData+ToString.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBF717058DB100BD49E8 /* NSData+ToString.m */; }; + 4C1A0EA7182572A60020FBF6 /* NSNumber+FSStorable.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBFB17058DCF00BD49E8 /* NSNumber+FSStorable.m */; }; + 4C1A0EA8182572A60020FBF6 /* NSDateFormatter+MultiThreading.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBFF17058DFE00BD49E8 /* NSDateFormatter+MultiThreading.m */; }; + 4C1A0EAA182572A60020FBF6 /* JFFLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = CEC70F10169DBA8B006D63DE /* JFFLogger.m */; }; + 4C1A0EAB182572A60020FBF6 /* NSLocale+CurrentInterfaceLanguageCode.m in Sources */ = {isa = PBXBuildFile; fileRef = 37805591164D432700459BA7 /* NSLocale+CurrentInterfaceLanguageCode.m */; }; + 4C1A0EAC182572A60020FBF6 /* NSSet+BlocksAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57FBB71611EFFF00124D90 /* NSSet+BlocksAdditions.m */; }; + 4C1A0EAD182572A60020FBF6 /* NSMutableSet+StorableSet.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57FBBC1611F0BF00124D90 /* NSMutableSet+StorableSet.m */; }; + 4C1A0EAE182572A60020FBF6 /* NSOrderedSet+BlocksAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE998C471626B988002D39FD /* NSOrderedSet+BlocksAdditions.m */; }; + 4C1A0EAF182572A60020FBF6 /* NSOrderedSet+NoThrowObjectAtIndex.m in Sources */ = {isa = PBXBuildFile; fileRef = 37063C6615FE0C5700B4B059 /* NSOrderedSet+NoThrowObjectAtIndex.m */; }; + 4C1A0EB0182572A60020FBF6 /* JFFSilentError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6DFB1617184A0600D86975 /* JFFSilentError.m */; }; + 4C1A0EB1182572A60020FBF6 /* NSError+SetToPointer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC01A9917438582003F1C88 /* NSError+SetToPointer.m */; }; + 4C1A0EB2182572A60020FBF6 /* NSError+WriteErrorToNSLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC01A911743836C003F1C88 /* NSError+WriteErrorToNSLog.m */; }; + 4C1A0EB3182572A60020FBF6 /* NSError+IsNetworkError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC01A9517438408003F1C88 /* NSError+IsNetworkError.m */; }; + 4C1A0EB4182572A60020FBF6 /* NSDecimalNumber+Increment.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBEB17058D4200BD49E8 /* NSDecimalNumber+Increment.m */; }; + 4C1A0EB6182572A60020FBF6 /* NSData+ToString.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBF717058DB100BD49E8 /* NSData+ToString.m */; }; + 4C1A0EB7182572A60020FBF6 /* NSNumber+FSStorable.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBFB17058DCF00BD49E8 /* NSNumber+FSStorable.m */; }; + 4C1A0EB8182572A60020FBF6 /* NSDateFormatter+MultiThreading.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBFF17058DFE00BD49E8 /* NSDateFormatter+MultiThreading.m */; }; + 4C1A0EBA182572A60020FBF6 /* JFFLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = CEC70F10169DBA8B006D63DE /* JFFLogger.m */; }; + 4C1A0EBB182572A60020FBF6 /* NSLocale+CurrentInterfaceLanguageCode.m in Sources */ = {isa = PBXBuildFile; fileRef = 37805591164D432700459BA7 /* NSLocale+CurrentInterfaceLanguageCode.m */; }; + 4C1A0EBC182572A60020FBF6 /* NSSet+BlocksAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57FBB71611EFFF00124D90 /* NSSet+BlocksAdditions.m */; }; + 4C1A0EBD182572A60020FBF6 /* NSMutableSet+StorableSet.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57FBBC1611F0BF00124D90 /* NSMutableSet+StorableSet.m */; }; + 4C1A0EBE182572A60020FBF6 /* NSOrderedSet+BlocksAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE998C471626B988002D39FD /* NSOrderedSet+BlocksAdditions.m */; }; + 4C1A0EBF182572A60020FBF6 /* NSOrderedSet+NoThrowObjectAtIndex.m in Sources */ = {isa = PBXBuildFile; fileRef = 37063C6615FE0C5700B4B059 /* NSOrderedSet+NoThrowObjectAtIndex.m */; }; + 4C1A0EC0182572A60020FBF6 /* JFFSilentError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6DFB1617184A0600D86975 /* JFFSilentError.m */; }; + 4C1A0EC1182572A60020FBF6 /* NSError+SetToPointer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC01A9917438582003F1C88 /* NSError+SetToPointer.m */; }; + 4C1A0EC2182572A60020FBF6 /* NSError+WriteErrorToNSLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC01A911743836C003F1C88 /* NSError+WriteErrorToNSLog.m */; }; + 4C1A0EC3182572A60020FBF6 /* NSError+IsNetworkError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC01A9517438408003F1C88 /* NSError+IsNetworkError.m */; }; + 4C1A0EC4182572A60020FBF6 /* NSDecimalNumber+Increment.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBEB17058D4200BD49E8 /* NSDecimalNumber+Increment.m */; }; + 4C1A0EC6182572A60020FBF6 /* NSData+ToString.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBF717058DB100BD49E8 /* NSData+ToString.m */; }; + 4C1A0EC7182572A60020FBF6 /* NSNumber+FSStorable.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBFB17058DCF00BD49E8 /* NSNumber+FSStorable.m */; }; + 4C1A0EC8182572A60020FBF6 /* NSDateFormatter+MultiThreading.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBFF17058DFE00BD49E8 /* NSDateFormatter+MultiThreading.m */; }; + 4C1A0ECA182572A60020FBF6 /* JFFLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = CEC70F10169DBA8B006D63DE /* JFFLogger.m */; }; + 4C1A0ECB182572A60020FBF6 /* NSLocale+CurrentInterfaceLanguageCode.m in Sources */ = {isa = PBXBuildFile; fileRef = 37805591164D432700459BA7 /* NSLocale+CurrentInterfaceLanguageCode.m */; }; + 4C1A0ECC182572A60020FBF6 /* NSSet+BlocksAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57FBB71611EFFF00124D90 /* NSSet+BlocksAdditions.m */; }; + 4C1A0ECD182572A60020FBF6 /* NSMutableSet+StorableSet.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57FBBC1611F0BF00124D90 /* NSMutableSet+StorableSet.m */; }; + 4C1A0ECE182572A60020FBF6 /* NSOrderedSet+BlocksAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE998C471626B988002D39FD /* NSOrderedSet+BlocksAdditions.m */; }; + 4C1A0ECF182572A60020FBF6 /* NSOrderedSet+NoThrowObjectAtIndex.m in Sources */ = {isa = PBXBuildFile; fileRef = 37063C6615FE0C5700B4B059 /* NSOrderedSet+NoThrowObjectAtIndex.m */; }; 4C27EDB11701C48500185768 /* libJFFTestTools.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C27EDAE1701C47300185768 /* libJFFTestTools.a */; }; 4C3B63A21701C84700D5A8FD /* JFFMutableAssignKeyDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C3B63A01701C84700D5A8FD /* JFFMutableAssignKeyDictionary.h */; }; 4C3B63A31701C84700D5A8FD /* JFFMutableAssignKeyDictionary.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4C3B63A11701C84700D5A8FD /* JFFMutableAssignKeyDictionary.mm */; }; @@ -86,6 +151,107 @@ 4C50BF5A171D85B400251A16 /* JFFError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6DFB12171849D800D86975 /* JFFError.m */; }; 4C50BF5B171D85B400251A16 /* JFFError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6DFB12171849D800D86975 /* JFFError.m */; }; 4C50BF5C171D85B500251A16 /* JFFError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6DFB12171849D800D86975 /* JFFError.m */; }; + 4C54855A1825710700AAEE22 /* JFFAssignProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DB67B1E13E980B70024EA6C /* JFFAssignProxy.m */; }; + 4C54855B1825710700AAEE22 /* JFFMutableAssignArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D713C6C13F3F62B007268DF /* JFFMutableAssignArray.m */; }; + 4C54855C1825710700AAEE22 /* JFFMutableAssignDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BD1820C1467D71B0033BEFF /* JFFMutableAssignDictionary.m */; }; + 4C54855D1825710700AAEE22 /* JFFMutableAssignKeyDictionary.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4C3B63A11701C84700D5A8FD /* JFFMutableAssignKeyDictionary.mm */; }; + 4C54855E1825710700AAEE22 /* JFFMulticastDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DB67B1913E97FCF0024EA6C /* JFFMulticastDelegate.m */; }; + 4C54855F1825710700AAEE22 /* JGCDAdditions.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1B7608991444912F0059E977 /* JGCDAdditions.mm */; }; + 4C5485691825711B00AAEE22 /* DelegateProxyUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA0979B15FF2ADE0080DEF7 /* DelegateProxyUtils.m */; }; + 4C54856A1825711B00AAEE22 /* NSString+DelegateProxySelectorsNames.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA0979F15FF2C110080DEF7 /* NSString+DelegateProxySelectorsNames.m */; }; + 4C54856B1825711B00AAEE22 /* JFFDelegateProxyClassMethods.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA097A315FF2C850080DEF7 /* JFFDelegateProxyClassMethods.m */; }; + 4C54856C1825711B00AAEE22 /* JFFProxyDelegatesDispatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA097A715FF2E3E0080DEF7 /* JFFProxyDelegatesDispatcher.m */; }; + 4C54856D1825711B00AAEE22 /* NSObject+Ownerships.m in Sources */ = {isa = PBXBuildFile; fileRef = 651BE138139107EA00DD6890 /* NSObject+Ownerships.m */; }; + 4C54856E1825711B00AAEE22 /* NSObject+OnDeallocBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = 651BE1CC1391A36800DD6890 /* NSObject+OnDeallocBlock.m */; }; + 4C54856F1825711B00AAEE22 /* NSObject+RuntimeExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D1DE52A13AB8269001FD56F /* NSObject+RuntimeExtensions.m */; }; + 4C5485701825711B00AAEE22 /* NSObject+Const0.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BE75CFE1434B3450076E068 /* NSObject+Const0.m */; }; + 4C5485711825711B00AAEE22 /* NSObject+ExpandArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B3EE0351487D03A00BA6680 /* NSObject+ExpandArray.m */; }; + 4C5485721825711B00AAEE22 /* NSObject+IsEqualTwoObjects.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BBD97DF15249C4200A34E64 /* NSObject+IsEqualTwoObjects.m */; }; + 4C5485731825711B00AAEE22 /* NSObject+DelegateProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 655C20E615FE5A4000022B11 /* NSObject+DelegateProxy.m */; }; + 4C5485741825711B00AAEE22 /* NSObject+JFFMeaningClass.m in Sources */ = {isa = PBXBuildFile; fileRef = CE444A1316085D5A00DD85B0 /* NSObject+JFFMeaningClass.m */; }; + 4C5485751825711B00AAEE22 /* NSObject+NsNullAsNil.m in Sources */ = {isa = PBXBuildFile; fileRef = CEC8479516A98A6C00065745 /* NSObject+NsNullAsNil.m */; }; + 4C5485761825711B00AAEE22 /* NSObject+ObjectMethodHook.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4CC643BD1717009B000BF15A /* NSObject+ObjectMethodHook.mm */; }; + 4C5485771825711B00AAEE22 /* DelegateProxyUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA0979B15FF2ADE0080DEF7 /* DelegateProxyUtils.m */; }; + 4C5485781825711B00AAEE22 /* NSString+DelegateProxySelectorsNames.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA0979F15FF2C110080DEF7 /* NSString+DelegateProxySelectorsNames.m */; }; + 4C5485791825711B00AAEE22 /* JFFDelegateProxyClassMethods.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA097A315FF2C850080DEF7 /* JFFDelegateProxyClassMethods.m */; }; + 4C54857A1825711B00AAEE22 /* JFFProxyDelegatesDispatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA097A715FF2E3E0080DEF7 /* JFFProxyDelegatesDispatcher.m */; }; + 4C54857B1825711B00AAEE22 /* NSObject+IsEqualTwoObjects.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BBD97DF15249C4200A34E64 /* NSObject+IsEqualTwoObjects.m */; }; + 4C54857C1825711B00AAEE22 /* NSObject+DelegateProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 655C20E615FE5A4000022B11 /* NSObject+DelegateProxy.m */; }; + 4C54857D1825711B00AAEE22 /* NSObject+JFFMeaningClass.m in Sources */ = {isa = PBXBuildFile; fileRef = CE444A1316085D5A00DD85B0 /* NSObject+JFFMeaningClass.m */; }; + 4C54857E1825711B00AAEE22 /* NSObject+NsNullAsNil.m in Sources */ = {isa = PBXBuildFile; fileRef = CEC8479516A98A6C00065745 /* NSObject+NsNullAsNil.m */; }; + 4C54857F1825711B00AAEE22 /* DelegateProxyUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA0979B15FF2ADE0080DEF7 /* DelegateProxyUtils.m */; }; + 4C5485801825711B00AAEE22 /* NSString+DelegateProxySelectorsNames.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA0979F15FF2C110080DEF7 /* NSString+DelegateProxySelectorsNames.m */; }; + 4C5485811825711B00AAEE22 /* JFFDelegateProxyClassMethods.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA097A315FF2C850080DEF7 /* JFFDelegateProxyClassMethods.m */; }; + 4C5485821825711B00AAEE22 /* JFFProxyDelegatesDispatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA097A715FF2E3E0080DEF7 /* JFFProxyDelegatesDispatcher.m */; }; + 4C5485831825711B00AAEE22 /* NSObject+IsEqualTwoObjects.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BBD97DF15249C4200A34E64 /* NSObject+IsEqualTwoObjects.m */; }; + 4C5485841825711B00AAEE22 /* NSObject+DelegateProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 655C20E615FE5A4000022B11 /* NSObject+DelegateProxy.m */; }; + 4C5485851825711B00AAEE22 /* NSObject+JFFMeaningClass.m in Sources */ = {isa = PBXBuildFile; fileRef = CE444A1316085D5A00DD85B0 /* NSObject+JFFMeaningClass.m */; }; + 4C5485861825711B00AAEE22 /* NSObject+NsNullAsNil.m in Sources */ = {isa = PBXBuildFile; fileRef = CEC8479516A98A6C00065745 /* NSObject+NsNullAsNil.m */; }; + 4C5485871825711C00AAEE22 /* NSObject+Const0.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BE75CFE1434B3450076E068 /* NSObject+Const0.m */; }; + 4C5485881825711C00AAEE22 /* NSObject+NsNullAsNil.m in Sources */ = {isa = PBXBuildFile; fileRef = CEC8479516A98A6C00065745 /* NSObject+NsNullAsNil.m */; }; + 4C5485891825712C00AAEE22 /* NSArray+ToURLsSkippingNils.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CB5CDEE174F55CA00F2B600 /* NSArray+ToURLsSkippingNils.m */; }; + 4C54858A1825712C00AAEE22 /* NSArray+ArrayByRemovingObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBA1A217661FA5007317E6 /* NSArray+ArrayByRemovingObject.m */; }; + 4C54858B1825712C00AAEE22 /* NSArray+ToURLsSkippingNils.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CB5CDEE174F55CA00F2B600 /* NSArray+ToURLsSkippingNils.m */; }; + 4C54858C1825712C00AAEE22 /* NSArray+ArrayByRemovingObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBA1A217661FA5007317E6 /* NSArray+ArrayByRemovingObject.m */; }; + 4C54858D1825712C00AAEE22 /* NSArray+ToURLsSkippingNils.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CB5CDEE174F55CA00F2B600 /* NSArray+ToURLsSkippingNils.m */; }; + 4C54858E1825712C00AAEE22 /* NSArray+ArrayByRemovingObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBA1A217661FA5007317E6 /* NSArray+ArrayByRemovingObject.m */; }; + 4C54858F1825712D00AAEE22 /* NSArray+NoThrowObjectAtIndex.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B3CDDE41445DFD300733BE5 /* NSArray+NoThrowObjectAtIndex.m */; }; + 4C5485901825712D00AAEE22 /* NSArray+ToURLsSkippingNils.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CB5CDEE174F55CA00F2B600 /* NSArray+ToURLsSkippingNils.m */; }; + 4C5485911825712D00AAEE22 /* NSArray+ArrayByRemovingObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBA1A217661FA5007317E6 /* NSArray+ArrayByRemovingObject.m */; }; + 4C5485921825713F00AAEE22 /* NSString+Format.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B909B8414EA919400B19283 /* NSString+Format.m */; }; + 4C5485931825713F00AAEE22 /* NSString+StringWithCutPrefix.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B5E1B9514D037EE0075049A /* NSString+StringWithCutPrefix.m */; }; + 4C5485941825713F00AAEE22 /* NSString+IsEmpty.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A3BB3E14DAB3CD008B71BE /* NSString+IsEmpty.m */; }; + 4C5485951825713F00AAEE22 /* NSString+IsEmailValid.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B1B280714D825A600FA5388 /* NSString+IsEmailValid.m */; }; + 4C5485961825713F00AAEE22 /* NSString+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B90996A14EA4D9500B19283 /* NSString+Base64.m */; }; + 4C5485971825713F00AAEE22 /* NSString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C98FBA016E0B38D00B6EFD8 /* NSString+HTML.m */; }; + 4C5485981825713F00AAEE22 /* NSString+MD5.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6AFDFC177AD544009D09C3 /* NSString+MD5.m */; }; + 4C5485991825713F00AAEE22 /* NSString+LocalizedPrice.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8D176817870ED900DE7624 /* NSString+LocalizedPrice.m */; }; + 4C54859A1825713F00AAEE22 /* NSString+StringFromTemplateString.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4E1E6C179D3529009E9C71 /* NSString+StringFromTemplateString.m */; }; + 4C54859B1825713F00AAEE22 /* NSString+Format.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B909B8414EA919400B19283 /* NSString+Format.m */; }; + 4C54859C1825713F00AAEE22 /* NSString+StringWithCutPrefix.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B5E1B9514D037EE0075049A /* NSString+StringWithCutPrefix.m */; }; + 4C54859D1825713F00AAEE22 /* NSString+IsEmpty.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A3BB3E14DAB3CD008B71BE /* NSString+IsEmpty.m */; }; + 4C54859E1825713F00AAEE22 /* NSString+IsEmailValid.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B1B280714D825A600FA5388 /* NSString+IsEmailValid.m */; }; + 4C54859F1825713F00AAEE22 /* NSString+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B90996A14EA4D9500B19283 /* NSString+Base64.m */; }; + 4C5485A01825713F00AAEE22 /* NSString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C98FBA016E0B38D00B6EFD8 /* NSString+HTML.m */; }; + 4C5485A11825713F00AAEE22 /* NSString+MD5.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6AFDFC177AD544009D09C3 /* NSString+MD5.m */; }; + 4C5485A21825713F00AAEE22 /* NSString+LocalizedPrice.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8D176817870ED900DE7624 /* NSString+LocalizedPrice.m */; }; + 4C5485A31825713F00AAEE22 /* NSString+StringFromTemplateString.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4E1E6C179D3529009E9C71 /* NSString+StringFromTemplateString.m */; }; + 4C5485A41825714000AAEE22 /* NSString+Format.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B909B8414EA919400B19283 /* NSString+Format.m */; }; + 4C5485A51825714000AAEE22 /* NSString+StringWithCutPrefix.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B5E1B9514D037EE0075049A /* NSString+StringWithCutPrefix.m */; }; + 4C5485A61825714000AAEE22 /* NSString+IsEmailValid.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B1B280714D825A600FA5388 /* NSString+IsEmailValid.m */; }; + 4C5485A71825714000AAEE22 /* NSString+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B90996A14EA4D9500B19283 /* NSString+Base64.m */; }; + 4C5485A81825714000AAEE22 /* NSString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C98FBA016E0B38D00B6EFD8 /* NSString+HTML.m */; }; + 4C5485A91825714000AAEE22 /* NSString+MD5.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6AFDFC177AD544009D09C3 /* NSString+MD5.m */; }; + 4C5485AA1825714000AAEE22 /* NSString+LocalizedPrice.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8D176817870ED900DE7624 /* NSString+LocalizedPrice.m */; }; + 4C5485AB1825714000AAEE22 /* NSString+StringFromTemplateString.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4E1E6C179D3529009E9C71 /* NSString+StringFromTemplateString.m */; }; + 4C5485AC1825714000AAEE22 /* NSString+PropertyName.m in Sources */ = {isa = PBXBuildFile; fileRef = 65648B7D13923EC4001E163C /* NSString+PropertyName.m */; }; + 4C5485AD1825714000AAEE22 /* NSString+PathExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D713CC613F539A5007268DF /* NSString+PathExtensions.m */; }; + 4C5485AE1825714000AAEE22 /* NSString+Trimm.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B6AAD8D1447039B00EA1D96 /* NSString+Trimm.m */; }; + 4C5485AF1825714000AAEE22 /* NSString+StringWithCutPrefix.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B5E1B9514D037EE0075049A /* NSString+StringWithCutPrefix.m */; }; + 4C5485B01825714000AAEE22 /* NSString+IsEmailValid.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B1B280714D825A600FA5388 /* NSString+IsEmailValid.m */; }; + 4C5485B11825714000AAEE22 /* NSString+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B90996A14EA4D9500B19283 /* NSString+Base64.m */; }; + 4C5485B31825714000AAEE22 /* NSString+FileAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B2A4A9D15EF62A3004ABB2E /* NSString+FileAttributes.m */; }; + 4C5485B41825714000AAEE22 /* NSString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C98FBA016E0B38D00B6EFD8 /* NSString+HTML.m */; }; + 4C5485B51825714000AAEE22 /* NSString+MD5.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6AFDFC177AD544009D09C3 /* NSString+MD5.m */; }; + 4C5485B61825714000AAEE22 /* NSString+LocalizedPrice.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8D176817870ED900DE7624 /* NSString+LocalizedPrice.m */; }; + 4C5485B71825714F00AAEE22 /* NSString+ToURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BA676CD144C474500B14D49 /* NSString+ToURL.m */; }; + 4C5485B81825714F00AAEE22 /* NSURL+ToURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BA676D1144C476600B14D49 /* NSURL+ToURL.m */; }; + 4C5485B91825714F00AAEE22 /* NSURL+CPlusPlus.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7E44D665158F179400A2C11E /* NSURL+CPlusPlus.mm */; }; + 4C5485BC1825715700AAEE22 /* JFFMemoryMgmt.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B909B7D14EA918800B19283 /* JFFMemoryMgmt.m */; }; + 4C5485BD1825715700AAEE22 /* JFFRuntimeInitializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B909B7E14EA918800B19283 /* JFFRuntimeInitializer.m */; }; + 4C5485BE1825715800AAEE22 /* JFFMemoryMgmt.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B909B7D14EA918800B19283 /* JFFMemoryMgmt.m */; }; + 4C5485BF1825715800AAEE22 /* JFFRuntimeInitializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B909B7E14EA918800B19283 /* JFFRuntimeInitializer.m */; }; + 4C5485C01825715800AAEE22 /* JFFMemoryMgmt.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B909B7D14EA918800B19283 /* JFFMemoryMgmt.m */; }; + 4C5485C11825716100AAEE22 /* NSDictionary+BlocksAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B054D4E1521C6F4008E4B9E /* NSDictionary+BlocksAdditions.m */; }; + 4C5485C21825716100AAEE22 /* NSDictionary+JFFExtendedDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B054D521521C739008E4B9E /* NSDictionary+JFFExtendedDictionary.m */; }; + 4C5485C31825716200AAEE22 /* NSDictionary+BlocksAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B054D4E1521C6F4008E4B9E /* NSDictionary+BlocksAdditions.m */; }; + 4C5485C41825716200AAEE22 /* NSDictionary+JFFExtendedDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B054D521521C739008E4B9E /* NSDictionary+JFFExtendedDictionary.m */; }; + 4C5485C51825716200AAEE22 /* NSDictionary+BlocksAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B054D4E1521C6F4008E4B9E /* NSDictionary+BlocksAdditions.m */; }; + 4C5485C61825716200AAEE22 /* NSDictionary+JFFExtendedDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B054D521521C739008E4B9E /* NSDictionary+JFFExtendedDictionary.m */; }; + 4C5485C71825716300AAEE22 /* NSDictionary+ValueWithType.m in Sources */ = {isa = PBXBuildFile; fileRef = 37497BCF1600971C00AF0C29 /* NSDictionary+ValueWithType.m */; }; + 4C5485C81825716300AAEE22 /* NSDictionary+JFFExtendedDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B054D521521C739008E4B9E /* NSDictionary+JFFExtendedDictionary.m */; }; + 4C5485C9182571BA00AAEE22 /* JFFRuntimeAddiotions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0FFDB170602CC00282900 /* JFFRuntimeAddiotions.m */; }; + 4C5485CB182571F200AAEE22 /* JFFRuntimeInitializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B909B7E14EA918800B19283 /* JFFRuntimeInitializer.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 4C6AFDFD177AD544009D09C3 /* NSString+MD5.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C6AFDFB177AD544009D09C3 /* NSString+MD5.h */; }; 4C6AFDFE177AD544009D09C3 /* NSString+MD5.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6AFDFC177AD544009D09C3 /* NSString+MD5.m */; }; 4C6DFB13171849D800D86975 /* JFFError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C6DFB11171849D800D86975 /* JFFError.h */; }; @@ -112,30 +278,23 @@ 4CC01A9B17438582003F1C88 /* NSError+SetToPointer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC01A9917438582003F1C88 /* NSError+SetToPointer.m */; }; 4CC643BE1717009B000BF15A /* NSObject+ObjectMethodHook.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CC643BC1717009B000BF15A /* NSObject+ObjectMethodHook.h */; }; 4CC643BF1717009B000BF15A /* NSObject+ObjectMethodHook.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4CC643BD1717009B000BF15A /* NSObject+ObjectMethodHook.mm */; }; - 4CC643C0171700BA000BF15A /* NSObject+ObjectMethodHook.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4CC643BD1717009B000BF15A /* NSObject+ObjectMethodHook.mm */; }; 4CC643C1171700BA000BF15A /* NSObject+ObjectMethodHook.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4CC643BD1717009B000BF15A /* NSObject+ObjectMethodHook.mm */; }; 4CC643C2171700BA000BF15A /* NSObject+ObjectMethodHook.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4CC643BD1717009B000BF15A /* NSObject+ObjectMethodHook.mm */; }; 4CC643C3171700CB000BF15A /* NSObject+ObjectMethodHook.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4CC643BD1717009B000BF15A /* NSObject+ObjectMethodHook.mm */; }; 4CC6BBEC17058D4200BD49E8 /* NSDecimalNumber+Increment.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CC6BBEA17058D4200BD49E8 /* NSDecimalNumber+Increment.h */; }; 4CC6BBED17058D4200BD49E8 /* NSDecimalNumber+Increment.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBEB17058D4200BD49E8 /* NSDecimalNumber+Increment.m */; }; - 4CC6BBF017058D5F00BD49E8 /* UIColor+ColorForHex.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CC6BBEE17058D5F00BD49E8 /* UIColor+ColorForHex.h */; }; - 4CC6BBF117058D5F00BD49E8 /* UIColor+ColorForHex.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBEF17058D5F00BD49E8 /* UIColor+ColorForHex.m */; }; 4CC6BBF817058DB100BD49E8 /* NSData+ToString.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CC6BBF617058DB100BD49E8 /* NSData+ToString.h */; }; 4CC6BBF917058DB100BD49E8 /* NSData+ToString.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBF717058DB100BD49E8 /* NSData+ToString.m */; }; 4CC6BBFC17058DD000BD49E8 /* NSNumber+FSStorable.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CC6BBFA17058DCF00BD49E8 /* NSNumber+FSStorable.h */; }; 4CC6BBFD17058DD000BD49E8 /* NSNumber+FSStorable.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBFB17058DCF00BD49E8 /* NSNumber+FSStorable.m */; }; 4CC6BC0017058DFF00BD49E8 /* NSDateFormatter+MultiThreading.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CC6BBFE17058DFE00BD49E8 /* NSDateFormatter+MultiThreading.h */; }; 4CC6BC0117058DFF00BD49E8 /* NSDateFormatter+MultiThreading.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BBFF17058DFE00BD49E8 /* NSDateFormatter+MultiThreading.m */; }; - 4CC6BC0817058E3900BD49E8 /* UIDevice+PlatformName.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CC6BC0617058E3700BD49E8 /* UIDevice+PlatformName.h */; }; - 4CC6BC0917058E3900BD49E8 /* UIDevice+PlatformName.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6BC0717058E3800BD49E8 /* UIDevice+PlatformName.m */; }; 4CEED6BB1701E236004CFCB3 /* JFFMutableAssignKeyDictionaryTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEED6B51701E0F5004CFCB3 /* JFFMutableAssignKeyDictionaryTest.m */; }; - 4CEED6BC1701E23C004CFCB3 /* JFFMutableAssignKeyDictionary.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4C3B63A11701C84700D5A8FD /* JFFMutableAssignKeyDictionary.mm */; }; 4CEED6BD1701E23C004CFCB3 /* JFFMutableAssignKeyDictionary.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4C3B63A11701C84700D5A8FD /* JFFMutableAssignKeyDictionary.mm */; }; 4CEED6BE1701E23C004CFCB3 /* JFFMutableAssignKeyDictionary.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4C3B63A11701C84700D5A8FD /* JFFMutableAssignKeyDictionary.mm */; }; 4CEED6BF1701E23D004CFCB3 /* JFFMutableAssignKeyDictionary.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4C3B63A11701C84700D5A8FD /* JFFMutableAssignKeyDictionary.mm */; }; 4CF0FFDC170602CC00282900 /* JFFRuntimeAddiotions.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CF0FFDA170602CC00282900 /* JFFRuntimeAddiotions.h */; }; 4CF0FFDD170602CC00282900 /* JFFRuntimeAddiotions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0FFDB170602CC00282900 /* JFFRuntimeAddiotions.m */; }; - 4CF0FFDE1706038200282900 /* JFFRuntimeAddiotions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0FFDB170602CC00282900 /* JFFRuntimeAddiotions.m */; }; 4CF0FFDF1706038200282900 /* JFFRuntimeAddiotions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0FFDB170602CC00282900 /* JFFRuntimeAddiotions.m */; }; 4CF0FFE01706038300282900 /* JFFRuntimeAddiotions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0FFDB170602CC00282900 /* JFFRuntimeAddiotions.m */; }; 4CF0FFE11706038300282900 /* JFFRuntimeAddiotions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0FFDB170602CC00282900 /* JFFRuntimeAddiotions.m */; }; @@ -237,10 +396,6 @@ 65802AA5148BF4A00040A93A /* NSArray+RemoveDuplicates.m in Sources */ = {isa = PBXBuildFile; fileRef = 53BCF8DF143239D100E896B3 /* NSArray+RemoveDuplicates.m */; }; 65802AA6148BF4A30040A93A /* NSArray+IsEmpty.m in Sources */ = {isa = PBXBuildFile; fileRef = 53E366C71433760A002AB0B9 /* NSArray+IsEmpty.m */; }; 65802AA7148BF4A60040A93A /* NSArray+NoThrowObjectAtIndex.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B3CDDE41445DFD300733BE5 /* NSArray+NoThrowObjectAtIndex.m */; }; - 65802AA8148BF4AB0040A93A /* NSObject+Ownerships.m in Sources */ = {isa = PBXBuildFile; fileRef = 651BE138139107EA00DD6890 /* NSObject+Ownerships.m */; }; - 65802AA9148BF4AE0040A93A /* NSObject+OnDeallocBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = 651BE1CC1391A36800DD6890 /* NSObject+OnDeallocBlock.m */; }; - 65802AAA148BF4B00040A93A /* NSObject+RuntimeExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D1DE52A13AB8269001FD56F /* NSObject+RuntimeExtensions.m */; }; - 65802AAB148BF4B20040A93A /* NSObject+Const0.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BE75CFE1434B3450076E068 /* NSObject+Const0.m */; }; 7E44D666158F179400A2C11E /* NSURL+CPlusPlus.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E44D664158F179400A2C11E /* NSURL+CPlusPlus.h */; }; 7E44D667158F179400A2C11E /* NSURL+CPlusPlus.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E44D664158F179400A2C11E /* NSURL+CPlusPlus.h */; }; 7E44D668158F179400A2C11E /* NSURL+CPlusPlus.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E44D664158F179400A2C11E /* NSURL+CPlusPlus.h */; }; @@ -253,10 +408,6 @@ 7E44D672158F189F00A2C11E /* NSString+CPlusPlus.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E44D66F158F189F00A2C11E /* NSString+CPlusPlus.h */; }; 7E44D673158F189F00A2C11E /* NSString+CPlusPlus.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E44D66F158F189F00A2C11E /* NSString+CPlusPlus.h */; }; 7E44D674158F189F00A2C11E /* NSString+CPlusPlus.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E44D66F158F189F00A2C11E /* NSString+CPlusPlus.h */; }; - 7E44D675158F189F00A2C11E /* NSString+CPlusPlus.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7E44D670158F189F00A2C11E /* NSString+CPlusPlus.mm */; }; - 7E44D676158F189F00A2C11E /* NSString+CPlusPlus.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7E44D670158F189F00A2C11E /* NSString+CPlusPlus.mm */; }; - 7E44D677158F189F00A2C11E /* NSString+CPlusPlus.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7E44D670158F189F00A2C11E /* NSString+CPlusPlus.mm */; }; - 7E44D678158F189F00A2C11E /* NSString+CPlusPlus.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7E44D670158F189F00A2C11E /* NSString+CPlusPlus.mm */; }; 7E57F42514F93738002D139B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; 7E57F42B14F93738002D139B /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7E57F42914F93738002D139B /* InfoPlist.strings */; }; 7E57F43114F937E0002D139B /* NSString+ToURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BA676CD144C474500B14D49 /* NSString+ToURL.m */; }; @@ -376,8 +527,6 @@ CEB90823160C709D00EFC230 /* NSObject+DelegateProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 655C20E615FE5A4000022B11 /* NSObject+DelegateProxy.m */; }; CEB90824160C70A300EFC230 /* DelegateProxyUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA0979B15FF2ADE0080DEF7 /* DelegateProxyUtils.m */; }; CEB90825160C70A300EFC230 /* NSString+DelegateProxySelectorsNames.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA0979F15FF2C110080DEF7 /* NSString+DelegateProxySelectorsNames.m */; }; - CEB90826160C70B400EFC230 /* JFFMutableAssignArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D713C6C13F3F62B007268DF /* JFFMutableAssignArray.m */; }; - CEB90827160C711200EFC230 /* JFFAssignProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DB67B1E13E980B70024EA6C /* JFFAssignProxy.m */; }; CEB90828160C712C00EFC230 /* NSObject+RuntimeExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D1DE52A13AB8269001FD56F /* NSObject+RuntimeExtensions.m */; }; CEB90829160C73DE00EFC230 /* NSObject+Ownerships.m in Sources */ = {isa = PBXBuildFile; fileRef = 651BE138139107EA00DD6890 /* NSObject+Ownerships.m */; }; CEB9082A160C73EC00EFC230 /* NSObject+OnDeallocBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = 651BE1CC1391A36800DD6890 /* NSObject+OnDeallocBlock.m */; }; @@ -391,9 +540,7 @@ CEE653D016144C8900C4D536 /* JFFRuntimeInitializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B909B7E14EA918800B19283 /* JFFRuntimeInitializer.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; CEE653D31614502400C4D536 /* JFFOnDeallocBlockOwnerTest.m in Sources */ = {isa = PBXBuildFile; fileRef = CEE653D21614502400C4D536 /* JFFOnDeallocBlockOwnerTest.m */; }; CEE653D61614512E00C4D536 /* JFFMutableAssignDictionaryTest.m in Sources */ = {isa = PBXBuildFile; fileRef = CEE653D51614512E00C4D536 /* JFFMutableAssignDictionaryTest.m */; }; - CEE653D7161451BF00C4D536 /* JFFMutableAssignDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BD1820C1467D71B0033BEFF /* JFFMutableAssignDictionary.m */; }; CEE653DA16145C0D00C4D536 /* JFFMulticastDelegateTest.m in Sources */ = {isa = PBXBuildFile; fileRef = CEE653D916145C0D00C4D536 /* JFFMulticastDelegateTest.m */; }; - CEE653DB16145CED00C4D536 /* JFFMulticastDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DB67B1913E97FCF0024EA6C /* JFFMulticastDelegate.m */; }; CEE653DE16145D1900C4D536 /* JFFAssignProxyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = CEE653DD16145D1900C4D536 /* JFFAssignProxyTest.m */; }; CEE653E116145E6300C4D536 /* NSObject+OwnershipsTest.m in Sources */ = {isa = PBXBuildFile; fileRef = CEE653E016145E6300C4D536 /* NSObject+OwnershipsTest.m */; }; CEE653E41614669500C4D536 /* JFFSimpleBlockHolderTest.m in Sources */ = {isa = PBXBuildFile; fileRef = CEE653E31614669200C4D536 /* JFFSimpleBlockHolderTest.m */; }; @@ -510,16 +657,12 @@ 4CC643BD1717009B000BF15A /* NSObject+ObjectMethodHook.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "NSObject+ObjectMethodHook.mm"; sourceTree = ""; }; 4CC6BBEA17058D4200BD49E8 /* NSDecimalNumber+Increment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDecimalNumber+Increment.h"; sourceTree = ""; }; 4CC6BBEB17058D4200BD49E8 /* NSDecimalNumber+Increment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDecimalNumber+Increment.m"; sourceTree = ""; }; - 4CC6BBEE17058D5F00BD49E8 /* UIColor+ColorForHex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+ColorForHex.h"; sourceTree = ""; }; - 4CC6BBEF17058D5F00BD49E8 /* UIColor+ColorForHex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+ColorForHex.m"; sourceTree = ""; }; 4CC6BBF617058DB100BD49E8 /* NSData+ToString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+ToString.h"; sourceTree = ""; }; 4CC6BBF717058DB100BD49E8 /* NSData+ToString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+ToString.m"; sourceTree = ""; }; 4CC6BBFA17058DCF00BD49E8 /* NSNumber+FSStorable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSNumber+FSStorable.h"; sourceTree = ""; }; 4CC6BBFB17058DCF00BD49E8 /* NSNumber+FSStorable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSNumber+FSStorable.m"; sourceTree = ""; }; 4CC6BBFE17058DFE00BD49E8 /* NSDateFormatter+MultiThreading.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDateFormatter+MultiThreading.h"; sourceTree = ""; }; 4CC6BBFF17058DFE00BD49E8 /* NSDateFormatter+MultiThreading.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDateFormatter+MultiThreading.m"; sourceTree = ""; }; - 4CC6BC0617058E3700BD49E8 /* UIDevice+PlatformName.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIDevice+PlatformName.h"; sourceTree = ""; }; - 4CC6BC0717058E3800BD49E8 /* UIDevice+PlatformName.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIDevice+PlatformName.m"; sourceTree = ""; }; 4CEED6B41701E0F5004CFCB3 /* JFFMutableAssignKeyDictionaryTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFMutableAssignKeyDictionaryTest.h; sourceTree = ""; }; 4CEED6B51701E0F5004CFCB3 /* JFFMutableAssignKeyDictionaryTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFMutableAssignKeyDictionaryTest.m; sourceTree = ""; }; 4CF0FFDA170602CC00282900 /* JFFRuntimeAddiotions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFRuntimeAddiotions.h; sourceTree = ""; }; @@ -856,16 +999,12 @@ children = ( 4CC6BBEA17058D4200BD49E8 /* NSDecimalNumber+Increment.h */, 4CC6BBEB17058D4200BD49E8 /* NSDecimalNumber+Increment.m */, - 4CC6BBEE17058D5F00BD49E8 /* UIColor+ColorForHex.h */, - 4CC6BBEF17058D5F00BD49E8 /* UIColor+ColorForHex.m */, 4CC6BBF617058DB100BD49E8 /* NSData+ToString.h */, 4CC6BBF717058DB100BD49E8 /* NSData+ToString.m */, 4CC6BBFA17058DCF00BD49E8 /* NSNumber+FSStorable.h */, 4CC6BBFB17058DCF00BD49E8 /* NSNumber+FSStorable.m */, 4CC6BBFE17058DFE00BD49E8 /* NSDateFormatter+MultiThreading.h */, 4CC6BBFF17058DFE00BD49E8 /* NSDateFormatter+MultiThreading.m */, - 4CC6BC0617058E3700BD49E8 /* UIDevice+PlatformName.h */, - 4CC6BC0717058E3800BD49E8 /* UIDevice+PlatformName.m */, ); path = Categories; sourceTree = ""; @@ -1206,6 +1345,7 @@ 5391040C14A88C04007315A3 /* JGCDAdditions.h in Headers */, 5391041014A88C04007315A3 /* NSArray+NoThrowObjectAtIndex.h in Headers */, 5391041114A88C04007315A3 /* NSString+Trimm.h in Headers */, + 4C069435182D3BAA0099BB66 /* JFFMemoryMgmt.h in Headers */, 5391041414A88C04007315A3 /* NSString+ToURL.h in Headers */, 5391041514A88C04007315A3 /* NSURL+ToURL.h in Headers */, 5391041614A88C04007315A3 /* JFFMutableAssignDictionary.h in Headers */, @@ -1231,6 +1371,7 @@ 7E44D672158F189F00A2C11E /* NSString+CPlusPlus.h in Headers */, 1B9C101115C802E600C20BCA /* JFFClangLiterals.h in Headers */, 1B14141F15DBCD3F00EFB2B8 /* NSDate+DateDifference.h in Headers */, + 4C069437182D3BAC0099BB66 /* JFFMemoryMgmt.h in Headers */, 1B2A4A9F15EF62A3004ABB2E /* NSString+FileAttributes.h in Headers */, 37497BD11600971C00AF0C29 /* NSDictionary+ValueWithType.h in Headers */, ); @@ -1262,6 +1403,7 @@ 7E57F4BB14F93840002D139B /* NSObject+Const0.h in Headers */, 7E57F4BF14F93840002D139B /* NSObject+ExpandArray.h in Headers */, 7E57F4C314F93840002D139B /* JFFAssignProxy.h in Headers */, + 4C069436182D3BAB0099BB66 /* JFFMemoryMgmt.h in Headers */, 7E57F4C714F93840002D139B /* JFFMutableAssignArray.h in Headers */, 7E57F4C914F93840002D139B /* JFFMutableAssignDictionary.h in Headers */, 7E57F4CB14F93840002D139B /* JFFMulticastDelegate.h in Headers */, @@ -1341,11 +1483,9 @@ 4C98FBAC16E0B56D00B6EFD8 /* NSArray+Templates.hpp in Headers */, 4C3B63A21701C84700D5A8FD /* JFFMutableAssignKeyDictionary.h in Headers */, 4CC6BBEC17058D4200BD49E8 /* NSDecimalNumber+Increment.h in Headers */, - 4CC6BBF017058D5F00BD49E8 /* UIColor+ColorForHex.h in Headers */, 4CC6BBF817058DB100BD49E8 /* NSData+ToString.h in Headers */, 4CC6BBFC17058DD000BD49E8 /* NSNumber+FSStorable.h in Headers */, 4CC6BC0017058DFF00BD49E8 /* NSDateFormatter+MultiThreading.h in Headers */, - 4CC6BC0817058E3900BD49E8 /* UIDevice+PlatformName.h in Headers */, 4CF0FFDC170602CC00282900 /* JFFRuntimeAddiotions.h in Headers */, 4CC643BE1717009B000BF15A /* NSObject+ObjectMethodHook.h in Headers */, 4C6DFB13171849D800D86975 /* JFFError.h in Headers */, @@ -1461,7 +1601,8 @@ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastTestingUpgradeCheck = 0510; + LastUpgradeCheck = 0510; }; buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "JFFUtils" */; compatibilityVersion = "Xcode 3.2"; @@ -1586,19 +1727,33 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4C1A0EAF182572A60020FBF6 /* NSOrderedSet+NoThrowObjectAtIndex.m in Sources */, + 4C54859B1825713F00AAEE22 /* NSString+Format.m in Sources */, + 4C1A0EA1182572A60020FBF6 /* NSError+SetToPointer.m in Sources */, + 4C54859D1825713F00AAEE22 /* NSString+IsEmpty.m in Sources */, + 4C5485A11825713F00AAEE22 /* NSString+MD5.m in Sources */, 5391041B14A88C04007315A3 /* JFFSimpleBlockHolder.m in Sources */, + 4C1A0EA3182572A60020FBF6 /* NSError+IsNetworkError.m in Sources */, + 4C1A0EA2182572A60020FBF6 /* NSError+WriteErrorToNSLog.m in Sources */, 5391041C14A88C04007315A3 /* NSArray+BlocksAdditions.m in Sources */, + 4C1A0EAE182572A60020FBF6 /* NSOrderedSet+BlocksAdditions.m in Sources */, 5391041D14A88C04007315A3 /* NSObject+Ownerships.m in Sources */, 5391041E14A88C04007315A3 /* NSString+Search.m in Sources */, 5391041F14A88C04007315A3 /* JFFOnDeallocBlockOwner.m in Sources */, 5391042014A88C04007315A3 /* NSObject+OnDeallocBlock.m in Sources */, + 4C54858C1825712C00AAEE22 /* NSArray+ArrayByRemovingObject.m in Sources */, 5391042114A88C04007315A3 /* NSString+PropertyName.m in Sources */, 5391042314A88C04007315A3 /* NSObject+RuntimeExtensions.m in Sources */, 5391042514A88C04007315A3 /* JFFMulticastDelegate.m in Sources */, + 4C5485781825711B00AAEE22 /* NSString+DelegateProxySelectorsNames.m in Sources */, 5391042614A88C04007315A3 /* JFFAssignProxy.m in Sources */, 5391042714A88C04007315A3 /* JFFMutableAssignArray.m in Sources */, + 4C5485BD1825715700AAEE22 /* JFFRuntimeInitializer.m in Sources */, 5391042814A88C04007315A3 /* NSString+PathExtensions.m in Sources */, + 4C1A0EA4182572A60020FBF6 /* NSDecimalNumber+Increment.m in Sources */, 5391042914A88C04007315A3 /* NSMutableArray+ChangeCount.m in Sources */, + 4C5485A21825713F00AAEE22 /* NSString+LocalizedPrice.m in Sources */, + 4C5485A01825713F00AAEE22 /* NSString+HTML.m in Sources */, 5391042A14A88C04007315A3 /* NSArray+RemoveDuplicates.m in Sources */, 5391042B14A88C04007315A3 /* NSArray+IsEmpty.m in Sources */, 5391042C14A88C04007315A3 /* NSObject+Const0.m in Sources */, @@ -1606,18 +1761,41 @@ 5391043414A88C04007315A3 /* NSArray+NoThrowObjectAtIndex.m in Sources */, 5391043514A88C04007315A3 /* NSString+Trimm.m in Sources */, 5391043814A88C04007315A3 /* NSString+ToURL.m in Sources */, + 4C5485BC1825715700AAEE22 /* JFFMemoryMgmt.m in Sources */, + 4C1A0EAC182572A60020FBF6 /* NSSet+BlocksAdditions.m in Sources */, + 4C5485A31825713F00AAEE22 /* NSString+StringFromTemplateString.m in Sources */, + 4C54859E1825713F00AAEE22 /* NSString+IsEmailValid.m in Sources */, 5391043914A88C04007315A3 /* NSURL+ToURL.m in Sources */, 5391043A14A88C04007315A3 /* JFFMutableAssignDictionary.m in Sources */, 5391043C14A88C04007315A3 /* JSignedRange.m in Sources */, + 4C54858B1825712C00AAEE22 /* NSArray+ToURLsSkippingNils.m in Sources */, + 4C5485771825711B00AAEE22 /* DelegateProxyUtils.m in Sources */, + 4C54857C1825711B00AAEE22 /* NSObject+DelegateProxy.m in Sources */, 5391043D14A88C04007315A3 /* NSObject+ExpandArray.m in Sources */, + 4C5485C41825716200AAEE22 /* NSDictionary+JFFExtendedDictionary.m in Sources */, + 4C54857D1825711B00AAEE22 /* NSObject+JFFMeaningClass.m in Sources */, + 4C06950D182D41BE0099BB66 /* NSString+CPlusPlus.mm in Sources */, 7E44D66C158F179400A2C11E /* NSURL+CPlusPlus.mm in Sources */, - 7E44D677158F189F00A2C11E /* NSString+CPlusPlus.mm in Sources */, + 4C54857E1825711B00AAEE22 /* NSObject+NsNullAsNil.m in Sources */, + 4C1A0EA8182572A60020FBF6 /* NSDateFormatter+MultiThreading.m in Sources */, + 4C54857A1825711B00AAEE22 /* JFFProxyDelegatesDispatcher.m in Sources */, + 4C54859F1825713F00AAEE22 /* NSString+Base64.m in Sources */, + 4C54859C1825713F00AAEE22 /* NSString+StringWithCutPrefix.m in Sources */, 1B14142415DBCD3F00EFB2B8 /* NSDate+DateDifference.m in Sources */, + 4C1A0EA0182572A60020FBF6 /* JFFSilentError.m in Sources */, 1B2A4AA415EF62A3004ABB2E /* NSString+FileAttributes.m in Sources */, 37497BD61600971C00AF0C29 /* NSDictionary+ValueWithType.m in Sources */, 4CEED6BE1701E23C004CFCB3 /* JFFMutableAssignKeyDictionary.mm in Sources */, 4CF0FFDF1706038200282900 /* JFFRuntimeAddiotions.m in Sources */, 4CC643C1171700BA000BF15A /* NSObject+ObjectMethodHook.mm in Sources */, + 4C1A0EAD182572A60020FBF6 /* NSMutableSet+StorableSet.m in Sources */, + 4C1A0EA7182572A60020FBF6 /* NSNumber+FSStorable.m in Sources */, + 4C5485791825711B00AAEE22 /* JFFDelegateProxyClassMethods.m in Sources */, + 4C1A0EAA182572A60020FBF6 /* JFFLogger.m in Sources */, + 4C1A0EA6182572A60020FBF6 /* NSData+ToString.m in Sources */, + 4C5485C31825716200AAEE22 /* NSDictionary+BlocksAdditions.m in Sources */, + 4C1A0EAB182572A60020FBF6 /* NSLocale+CurrentInterfaceLanguageCode.m in Sources */, + 4C54857B1825711B00AAEE22 /* NSObject+IsEqualTwoObjects.m in Sources */, 4C50BF5B171D85B400251A16 /* JFFError.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1626,37 +1804,75 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4C54859A1825713F00AAEE22 /* NSString+StringFromTemplateString.m in Sources */, + 4C54856D1825711B00AAEE22 /* NSObject+Ownerships.m in Sources */, + 4C5485921825713F00AAEE22 /* NSString+Format.m in Sources */, 65802A6C148BF2B50040A93A /* JGCDAdditions.mm in Sources */, + 4C5485891825712C00AAEE22 /* NSArray+ToURLsSkippingNils.m in Sources */, 65802A6E148BF2BA0040A93A /* JFFMulticastDelegate.m in Sources */, + 4C5485751825711B00AAEE22 /* NSObject+NsNullAsNil.m in Sources */, 65802A6F148BF2BE0040A93A /* JFFMutableAssignDictionary.m in Sources */, 65802A70148BF2C10040A93A /* JFFMutableAssignArray.m in Sources */, + 4C5485741825711B00AAEE22 /* NSObject+JFFMeaningClass.m in Sources */, 65802A72148BF2C80040A93A /* JFFAssignProxy.m in Sources */, + 4C1A0E9D182572A50020FBF6 /* NSMutableSet+StorableSet.m in Sources */, + 4C5485761825711B00AAEE22 /* NSObject+ObjectMethodHook.mm in Sources */, + 4C5485701825711B00AAEE22 /* NSObject+Const0.m in Sources */, 65802A95148BF4610040A93A /* NSString+ToURL.m in Sources */, + 4C1A0E97182572A50020FBF6 /* NSNumber+FSStorable.m in Sources */, + 4C5485981825713F00AAEE22 /* NSString+MD5.m in Sources */, + 4C1A0E91182572A50020FBF6 /* NSError+SetToPointer.m in Sources */, 65802A97148BF4640040A93A /* NSURL+ToURL.m in Sources */, + 4C5485CB182571F200AAEE22 /* JFFRuntimeInitializer.m in Sources */, 65802A9C148BF4800040A93A /* JFFSimpleBlockHolder.m in Sources */, + 4C5485C21825716100AAEE22 /* NSDictionary+JFFExtendedDictionary.m in Sources */, 65802A9D148BF4820040A93A /* JFFOnDeallocBlockOwner.m in Sources */, + 4C54856A1825711B00AAEE22 /* NSString+DelegateProxySelectorsNames.m in Sources */, + 4C5485931825713F00AAEE22 /* NSString+StringWithCutPrefix.m in Sources */, + 4C1A0E94182572A50020FBF6 /* NSDecimalNumber+Increment.m in Sources */, + 4C069438182D3BC60099BB66 /* JFFMemoryMgmt.m in Sources */, + 4C1A0E96182572A50020FBF6 /* NSData+ToString.m in Sources */, 65802A9E148BF4870040A93A /* NSString+Search.m in Sources */, + 4C1A0E9C182572A50020FBF6 /* NSSet+BlocksAdditions.m in Sources */, + 4C5485C9182571BA00AAEE22 /* JFFRuntimeAddiotions.m in Sources */, 65802A9F148BF4890040A93A /* NSString+PropertyName.m in Sources */, 65802AA0148BF48F0040A93A /* NSString+PathExtensions.m in Sources */, 65802AA1148BF4920040A93A /* NSString+Trimm.m in Sources */, 65802AA3148BF49B0040A93A /* NSMutableArray+ChangeCount.m in Sources */, 65802AA4148BF49D0040A93A /* NSArray+BlocksAdditions.m in Sources */, + 4C5485721825711B00AAEE22 /* NSObject+IsEqualTwoObjects.m in Sources */, + 4C5485691825711B00AAEE22 /* DelegateProxyUtils.m in Sources */, + 4C1A0E92182572A50020FBF6 /* NSError+WriteErrorToNSLog.m in Sources */, 65802AA5148BF4A00040A93A /* NSArray+RemoveDuplicates.m in Sources */, + 4C1A0E9A182572A50020FBF6 /* JFFLogger.m in Sources */, + 4C5485731825711B00AAEE22 /* NSObject+DelegateProxy.m in Sources */, + 4C54856E1825711B00AAEE22 /* NSObject+OnDeallocBlock.m in Sources */, + 4C5485941825713F00AAEE22 /* NSString+IsEmpty.m in Sources */, 65802AA6148BF4A30040A93A /* NSArray+IsEmpty.m in Sources */, + 4C5485951825713F00AAEE22 /* NSString+IsEmailValid.m in Sources */, 65802AA7148BF4A60040A93A /* NSArray+NoThrowObjectAtIndex.m in Sources */, - 65802AA8148BF4AB0040A93A /* NSObject+Ownerships.m in Sources */, - 65802AA9148BF4AE0040A93A /* NSObject+OnDeallocBlock.m in Sources */, - 65802AAA148BF4B00040A93A /* NSObject+RuntimeExtensions.m in Sources */, - 65802AAB148BF4B20040A93A /* NSObject+Const0.m in Sources */, + 4C54856F1825711B00AAEE22 /* NSObject+RuntimeExtensions.m in Sources */, + 4C5485991825713F00AAEE22 /* NSString+LocalizedPrice.m in Sources */, + 4C5485971825713F00AAEE22 /* NSString+HTML.m in Sources */, + 4C1A0E98182572A50020FBF6 /* NSDateFormatter+MultiThreading.m in Sources */, + 4C5485961825713F00AAEE22 /* NSString+Base64.m in Sources */, + 4C1A0E90182572A50020FBF6 /* JFFSilentError.m in Sources */, + 4C5485711825711B00AAEE22 /* NSObject+ExpandArray.m in Sources */, 7E44D66B158F179400A2C11E /* NSURL+CPlusPlus.mm in Sources */, - 7E44D676158F189F00A2C11E /* NSString+CPlusPlus.mm in Sources */, + 4C5485C11825716100AAEE22 /* NSDictionary+BlocksAdditions.m in Sources */, + 4C1A0E93182572A50020FBF6 /* NSError+IsNetworkError.m in Sources */, 1B14142315DBCD3F00EFB2B8 /* NSDate+DateDifference.m in Sources */, + 4C54856C1825711B00AAEE22 /* JFFProxyDelegatesDispatcher.m in Sources */, + 4C54856B1825711B00AAEE22 /* JFFDelegateProxyClassMethods.m in Sources */, 1B2A4AA315EF62A3004ABB2E /* NSString+FileAttributes.m in Sources */, + 4C1A0E9E182572A50020FBF6 /* NSOrderedSet+BlocksAdditions.m in Sources */, + 4C1A0E9F182572A50020FBF6 /* NSOrderedSet+NoThrowObjectAtIndex.m in Sources */, + 4C1A0E9B182572A50020FBF6 /* NSLocale+CurrentInterfaceLanguageCode.m in Sources */, + 4C54858A1825712C00AAEE22 /* NSArray+ArrayByRemovingObject.m in Sources */, 37497BD51600971C00AF0C29 /* NSDictionary+ValueWithType.m in Sources */, 4CEED6BF1701E23D004CFCB3 /* JFFMutableAssignKeyDictionary.mm in Sources */, - 4CF0FFDE1706038200282900 /* JFFRuntimeAddiotions.m in Sources */, - 4CC643C0171700BA000BF15A /* NSObject+ObjectMethodHook.mm in Sources */, 4C50BF5A171D85B400251A16 /* JFFError.m in Sources */, + 4C06950C182D41BD0099BB66 /* NSString+CPlusPlus.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1665,39 +1881,75 @@ buildActionMask = 2147483647; files = ( 7E57F43114F937E0002D139B /* NSString+ToURL.m in Sources */, + 4C54858E1825712C00AAEE22 /* NSArray+ArrayByRemovingObject.m in Sources */, 7E57F43314F937E0002D139B /* NSURL+ToURL.m in Sources */, + 4C1A0EB4182572A60020FBF6 /* NSDecimalNumber+Increment.m in Sources */, 7E57F44214F937E0002D139B /* JFFSimpleBlockHolder.m in Sources */, 7E57F44414F937E0002D139B /* JFFOnDeallocBlockOwner.m in Sources */, + 4C1A0EB7182572A60020FBF6 /* NSNumber+FSStorable.m in Sources */, + 4C5485841825711B00AAEE22 /* NSObject+DelegateProxy.m in Sources */, + 4C5485BE1825715800AAEE22 /* JFFMemoryMgmt.m in Sources */, 7E57F44814F937E0002D139B /* NSString+Format.m in Sources */, + 4C5485801825711B00AAEE22 /* NSString+DelegateProxySelectorsNames.m in Sources */, + 4C5485A51825714000AAEE22 /* NSString+StringWithCutPrefix.m in Sources */, 7E57F44A14F937E0002D139B /* NSString+Search.m in Sources */, 7E57F44C14F937E0002D139B /* NSString+PropertyName.m in Sources */, + 4C5485AB1825714000AAEE22 /* NSString+StringFromTemplateString.m in Sources */, 7E57F44E14F937E0002D139B /* NSString+PathExtensions.m in Sources */, + 4C1A0EBF182572A60020FBF6 /* NSOrderedSet+NoThrowObjectAtIndex.m in Sources */, 7E57F45014F937E0002D139B /* NSString+Trimm.m in Sources */, 7E57F45414F937E0002D139B /* NSString+IsEmpty.m in Sources */, 7E57F45914F937E0002D139B /* NSMutableArray+ChangeCount.m in Sources */, + 4C5485851825711B00AAEE22 /* NSObject+JFFMeaningClass.m in Sources */, 7E57F45B14F937E0002D139B /* NSArray+BlocksAdditions.m in Sources */, 7E57F45D14F937E0002D139B /* NSArray+RemoveDuplicates.m in Sources */, + 4C1A0EB1182572A60020FBF6 /* NSError+SetToPointer.m in Sources */, 7E57F45F14F937E0002D139B /* NSArray+IsEmpty.m in Sources */, 7E57F46114F937E0002D139B /* NSArray+NoThrowObjectAtIndex.m in Sources */, + 4C1A0EB2182572A60020FBF6 /* NSError+WriteErrorToNSLog.m in Sources */, 7E57F46314F937E0002D139B /* NSObject+Ownerships.m in Sources */, + 4C5485A91825714000AAEE22 /* NSString+MD5.m in Sources */, + 4C5485821825711B00AAEE22 /* JFFProxyDelegatesDispatcher.m in Sources */, + 4C5485831825711B00AAEE22 /* NSObject+IsEqualTwoObjects.m in Sources */, + 4C5485A41825714000AAEE22 /* NSString+Format.m in Sources */, 7E57F46514F937E0002D139B /* NSObject+OnDeallocBlock.m in Sources */, + 4C5485A61825714000AAEE22 /* NSString+IsEmailValid.m in Sources */, + 4C1A0EBC182572A60020FBF6 /* NSSet+BlocksAdditions.m in Sources */, + 4C5485861825711B00AAEE22 /* NSObject+NsNullAsNil.m in Sources */, + 4C5485A71825714000AAEE22 /* NSString+Base64.m in Sources */, 7E57F46714F937E0002D139B /* NSObject+RuntimeExtensions.m in Sources */, + 4C1A0EBA182572A60020FBF6 /* JFFLogger.m in Sources */, + 4C1A0EBB182572A60020FBF6 /* NSLocale+CurrentInterfaceLanguageCode.m in Sources */, 7E57F46914F937E0002D139B /* NSObject+Const0.m in Sources */, 7E57F46D14F937E0002D139B /* NSObject+ExpandArray.m in Sources */, 7E57F47114F937E0002D139B /* JFFAssignProxy.m in Sources */, + 4C5485AA1825714000AAEE22 /* NSString+LocalizedPrice.m in Sources */, + 4C5485A81825714000AAEE22 /* NSString+HTML.m in Sources */, 7E57F47514F937E0002D139B /* JFFMutableAssignArray.m in Sources */, 7E57F47714F937E0002D139B /* JFFMutableAssignDictionary.m in Sources */, + 4C1A0EB8182572A60020FBF6 /* NSDateFormatter+MultiThreading.m in Sources */, 7E57F47914F937E0002D139B /* JFFMulticastDelegate.m in Sources */, + 4C1A0EB6182572A60020FBF6 /* NSData+ToString.m in Sources */, + 4C5485C51825716200AAEE22 /* NSDictionary+BlocksAdditions.m in Sources */, + 4C1A0EBE182572A60020FBF6 /* NSOrderedSet+BlocksAdditions.m in Sources */, + 4C54858D1825712C00AAEE22 /* NSArray+ToURLsSkippingNils.m in Sources */, 7E57F47D14F937E0002D139B /* JGCDAdditions.mm in Sources */, + 4C5485C61825716200AAEE22 /* NSDictionary+JFFExtendedDictionary.m in Sources */, 7E57F47F14F937E0002D139B /* JSignedRange.m in Sources */, + 4C1A0EBD182572A60020FBF6 /* NSMutableSet+StorableSet.m in Sources */, 7E44D66D158F179400A2C11E /* NSURL+CPlusPlus.mm in Sources */, - 7E44D678158F189F00A2C11E /* NSString+CPlusPlus.mm in Sources */, 1B14142515DBCD3F00EFB2B8 /* NSDate+DateDifference.m in Sources */, + 4C5485811825711B00AAEE22 /* JFFDelegateProxyClassMethods.m in Sources */, 1B2A4AA515EF62A3004ABB2E /* NSString+FileAttributes.m in Sources */, 37497BD71600971C00AF0C29 /* NSDictionary+ValueWithType.m in Sources */, 4CEED6BD1701E23C004CFCB3 /* JFFMutableAssignKeyDictionary.mm in Sources */, 4CF0FFE01706038300282900 /* JFFRuntimeAddiotions.m in Sources */, + 4C54857F1825711B00AAEE22 /* DelegateProxyUtils.m in Sources */, + 4C1A0EB0182572A60020FBF6 /* JFFSilentError.m in Sources */, + 4C06950E182D41BE0099BB66 /* NSString+CPlusPlus.mm in Sources */, 4CC643C2171700BA000BF15A /* NSObject+ObjectMethodHook.mm in Sources */, + 4C1A0EB3182572A60020FBF6 /* NSError+IsNetworkError.m in Sources */, + 4C5485BF1825715800AAEE22 /* JFFRuntimeInitializer.m in Sources */, 4C50BF5C171D85B500251A16 /* JFFError.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1706,66 +1958,103 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4C5485B01825714000AAEE22 /* NSString+IsEmailValid.m in Sources */, CE444A46160860F300DD85B0 /* EmptyStringTest.m in Sources */, + 4C5485AC1825714000AAEE22 /* NSString+PropertyName.m in Sources */, CE444A481608634700DD85B0 /* NSObject+JFFMeaningClass.m in Sources */, CE444A4B1608636400DD85B0 /* JFFMeaningClassTest.m in Sources */, CE444A6E1608698600DD85B0 /* NSString+IsEmpty.m in Sources */, CE914E54160B71B300C89F37 /* DelegateProxyTest.m in Sources */, + 4C5485B41825714000AAEE22 /* NSString+HTML.m in Sources */, CE914E5F160C4B0C00C89F37 /* JFFProxyDelegatesDispatcher.m in Sources */, + 4C5485B61825714000AAEE22 /* NSString+LocalizedPrice.m in Sources */, CE914E60160C4B1900C89F37 /* JFFDelegateProxyClassMethods.m in Sources */, + 4C54855D1825710700AAEE22 /* JFFMutableAssignKeyDictionary.mm in Sources */, + 4C1A0ECA182572A60020FBF6 /* JFFLogger.m in Sources */, + 4C5485C71825716300AAEE22 /* NSDictionary+ValueWithType.m in Sources */, CEB90821160C708300EFC230 /* NSArray+BlocksAdditions.m in Sources */, + 4C5485881825711C00AAEE22 /* NSObject+NsNullAsNil.m in Sources */, CEB90823160C709D00EFC230 /* NSObject+DelegateProxy.m in Sources */, CEB90824160C70A300EFC230 /* DelegateProxyUtils.m in Sources */, CEB90825160C70A300EFC230 /* NSString+DelegateProxySelectorsNames.m in Sources */, - CEB90826160C70B400EFC230 /* JFFMutableAssignArray.m in Sources */, - CEB90827160C711200EFC230 /* JFFAssignProxy.m in Sources */, + 4C5485AE1825714000AAEE22 /* NSString+Trimm.m in Sources */, + 4C1A0EC7182572A60020FBF6 /* NSNumber+FSStorable.m in Sources */, + 4C54855E1825710700AAEE22 /* JFFMulticastDelegate.m in Sources */, + 4C1A0EC3182572A60020FBF6 /* NSError+IsNetworkError.m in Sources */, CEB90828160C712C00EFC230 /* NSObject+RuntimeExtensions.m in Sources */, CEB90829160C73DE00EFC230 /* NSObject+Ownerships.m in Sources */, + 4C1A0EC8182572A60020FBF6 /* NSDateFormatter+MultiThreading.m in Sources */, + 4C54855F1825710700AAEE22 /* JGCDAdditions.mm in Sources */, CEB9082A160C73EC00EFC230 /* NSObject+OnDeallocBlock.m in Sources */, CEB9082B160C740300EFC230 /* JFFOnDeallocBlockOwner.m in Sources */, CE03CAB2160CAD0500039011 /* NSObjectInstancesCountTest.m in Sources */, CE57F8BB1611998D00124D90 /* DateDifferenceStringFromDateTest.m in Sources */, + 4C5485B31825714000AAEE22 /* NSString+FileAttributes.m in Sources */, CE57F8BD16119A5400124D90 /* NSDate+DateDifference.m in Sources */, CE57F8C01611A32000124D90 /* NumberOfCharacterFromStringTest.m in Sources */, CE57F8C11611A3D500124D90 /* NSString+Search.m in Sources */, + 4C1A0EC6182572A60020FBF6 /* NSData+ToString.m in Sources */, CE57F8C41611A61E00124D90 /* NSObject_IsEqualTwoObjectsTest.m in Sources */, + 4C54858F1825712D00AAEE22 /* NSArray+NoThrowObjectAtIndex.m in Sources */, CE57F8C51611A6AA00124D90 /* NSObject+IsEqualTwoObjects.m in Sources */, + 4C1A0ECC182572A60020FBF6 /* NSSet+BlocksAdditions.m in Sources */, CE57FBD81611F80800124D90 /* ObjcDynamicCastTest.mm in Sources */, CE57FBDD1611F8FC00124D90 /* JMParent.m in Sources */, + 4C54855A1825710700AAEE22 /* JFFAssignProxy.m in Sources */, + 4C1A0ECB182572A60020FBF6 /* NSLocale+CurrentInterfaceLanguageCode.m in Sources */, CE57FBE01611F90900124D90 /* JMChild.m in Sources */, CE609CF216134405008259CF /* JFFMutableAssignArrayTest.m in Sources */, CEE653D016144C8900C4D536 /* JFFRuntimeInitializer.m in Sources */, + 4C5485B11825714000AAEE22 /* NSString+Base64.m in Sources */, CEE653D31614502400C4D536 /* JFFOnDeallocBlockOwnerTest.m in Sources */, + 4C5485871825711C00AAEE22 /* NSObject+Const0.m in Sources */, + 4C5485C81825716300AAEE22 /* NSDictionary+JFFExtendedDictionary.m in Sources */, CEE653D61614512E00C4D536 /* JFFMutableAssignDictionaryTest.m in Sources */, - CEE653D7161451BF00C4D536 /* JFFMutableAssignDictionary.m in Sources */, + 4C06950F182D41BE0099BB66 /* NSString+CPlusPlus.mm in Sources */, CEE653DA16145C0D00C4D536 /* JFFMulticastDelegateTest.m in Sources */, - CEE653DB16145CED00C4D536 /* JFFMulticastDelegate.m in Sources */, CEE653DE16145D1900C4D536 /* JFFAssignProxyTest.m in Sources */, + 4C1A0ECF182572A60020FBF6 /* NSOrderedSet+NoThrowObjectAtIndex.m in Sources */, CEE653E116145E6300C4D536 /* NSObject+OwnershipsTest.m in Sources */, CEE653E41614669500C4D536 /* JFFSimpleBlockHolderTest.m in Sources */, + 4C5485B51825714000AAEE22 /* NSString+MD5.m in Sources */, CEE653E5161466DA00C4D536 /* JFFSimpleBlockHolder.m in Sources */, + 4C1A0ECD182572A60020FBF6 /* NSMutableSet+StorableSet.m in Sources */, CEE6574616148DCC00C4D536 /* NSObjectRuntimeExtensionsTest.m in Sources */, CEE6574A16148F3000C4D536 /* JUArrayAdditionsTest.m in Sources */, + 4C5485911825712D00AAEE22 /* NSArray+ArrayByRemovingObject.m in Sources */, CEE6574B16148F7E00C4D536 /* NSArray+RemoveDuplicates.m in Sources */, CEE6574C1614900000C4D536 /* NSArray+IsEmpty.m in Sources */, CE2B32871617B55F003FB5F8 /* JUMutableArrayTest.m in Sources */, + 4C5485AF1825714000AAEE22 /* NSString+StringWithCutPrefix.m in Sources */, + 4C1A0ECE182572A60020FBF6 /* NSOrderedSet+BlocksAdditions.m in Sources */, + 4C1A0EC2182572A60020FBF6 /* NSError+WriteErrorToNSLog.m in Sources */, + 4C5485B81825714F00AAEE22 /* NSURL+ToURL.m in Sources */, + 4C5485901825712D00AAEE22 /* NSArray+ToURLsSkippingNils.m in Sources */, + 4C54855C1825710700AAEE22 /* JFFMutableAssignDictionary.m in Sources */, + 4C1A0EC0182572A60020FBF6 /* JFFSilentError.m in Sources */, + 4C5485C01825715800AAEE22 /* JFFMemoryMgmt.m in Sources */, CE2B32891617B5BF003FB5F8 /* NSMutableArray+ChangeCount.m in Sources */, CE2B328C1617B5E9003FB5F8 /* JFFStringFormatTest.m in Sources */, CE2B328D1617B632003FB5F8 /* NSString+Format.m in Sources */, + 4C1A0EC1182572A60020FBF6 /* NSError+SetToPointer.m in Sources */, CE1BC324161B33AB007DEC95 /* NSArray+ExpandArrayTest.m in Sources */, CE1BC326161B349A007DEC95 /* NSObject+ExpandArray.m in Sources */, CE1BC36A161B38AF007DEC95 /* NSDictionary+BlocksAdditions.m in Sources */, + 4C5485AD1825714000AAEE22 /* NSString+PathExtensions.m in Sources */, CE1BC36E161B3A51007DEC95 /* NSDictionary+BlocksAdditionsTest.m in Sources */, + 4C5485B91825714F00AAEE22 /* NSURL+CPlusPlus.mm in Sources */, 4CEED6BB1701E236004CFCB3 /* JFFMutableAssignKeyDictionaryTest.m in Sources */, - 4CEED6BC1701E23C004CFCB3 /* JFFMutableAssignKeyDictionary.mm in Sources */, 4C712E1917046A0300346F5E /* MethodObserverTest.m in Sources */, 4C8A22791705913B000539D2 /* TypeSignatureTest.m in Sources */, 4CF0FFE11706038300282900 /* JFFRuntimeAddiotions.m in Sources */, + 4C54855B1825710700AAEE22 /* JFFMutableAssignArray.m in Sources */, 4CC643C3171700CB000BF15A /* NSObject+ObjectMethodHook.mm in Sources */, 4C50BF59171D85B300251A16 /* JFFError.m in Sources */, + 4C5485B71825714F00AAEE22 /* NSString+ToURL.m in Sources */, 4CAB2A571730097A001EB552 /* JFFRuntimeAddiotionsTest.m in Sources */, 4C4E1E72179D55AF009E9C71 /* StringFromTemplateString.m in Sources */, 4C4E1E77179D56D5009E9C71 /* NSString+StringFromTemplateString.m in Sources */, + 4C1A0EC4182572A60020FBF6 /* NSDecimalNumber+Increment.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1807,7 +2096,6 @@ 1B054D541521C739008E4B9E /* NSDictionary+JFFExtendedDictionary.m in Sources */, 1BBD97E115249C4200A34E64 /* NSObject+IsEqualTwoObjects.m in Sources */, 7E44D66A158F179400A2C11E /* NSURL+CPlusPlus.mm in Sources */, - 7E44D675158F189F00A2C11E /* NSString+CPlusPlus.mm in Sources */, 1B14142215DBCD3F00EFB2B8 /* NSDate+DateDifference.m in Sources */, 1B2A4AA215EF62A3004ABB2E /* NSString+FileAttributes.m in Sources */, 37063C6815FE0C5700B4B059 /* NSOrderedSet+NoThrowObjectAtIndex.m in Sources */, @@ -1821,6 +2109,7 @@ CE57FBB91611EFFF00124D90 /* NSSet+BlocksAdditions.m in Sources */, CE57FBBE1611F0BF00124D90 /* NSMutableSet+StorableSet.m in Sources */, CEE653CF16144C8900C4D536 /* JFFRuntimeInitializer.m in Sources */, + 4C06950B182D41BD0099BB66 /* NSString+CPlusPlus.mm in Sources */, CE998C491626B988002D39FD /* NSOrderedSet+BlocksAdditions.m in Sources */, 37805593164D432700459BA7 /* NSLocale+CurrentInterfaceLanguageCode.m in Sources */, CEC70F14169DBA8B006D63DE /* JFFLogger.m in Sources */, @@ -1828,11 +2117,9 @@ 4C98FBA216E0B38D00B6EFD8 /* NSString+HTML.m in Sources */, 4C3B63A31701C84700D5A8FD /* JFFMutableAssignKeyDictionary.mm in Sources */, 4CC6BBED17058D4200BD49E8 /* NSDecimalNumber+Increment.m in Sources */, - 4CC6BBF117058D5F00BD49E8 /* UIColor+ColorForHex.m in Sources */, 4CC6BBF917058DB100BD49E8 /* NSData+ToString.m in Sources */, 4CC6BBFD17058DD000BD49E8 /* NSNumber+FSStorable.m in Sources */, 4CC6BC0117058DFF00BD49E8 /* NSDateFormatter+MultiThreading.m in Sources */, - 4CC6BC0917058E3900BD49E8 /* UIDevice+PlatformName.m in Sources */, 4CF0FFDD170602CC00282900 /* JFFRuntimeAddiotions.m in Sources */, 4CC643BF1717009B000BF15A /* NSObject+ObjectMethodHook.mm in Sources */, 4C6DFB14171849D800D86975 /* JFFError.m in Sources */, @@ -1892,7 +2179,6 @@ GCC_PREFIX_HEADER = JFFUtils_Prefix.pch; HEADER_SEARCH_PATHS = ../; INSTALL_PATH = /usr/local/lib; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = JFFUtils; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -1909,7 +2195,6 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = JFFUtils_Prefix.pch; INSTALL_PATH = /usr/local/lib; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = JFFUtils; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -1920,6 +2205,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; GCC_OPTIMIZATION_LEVEL = 0; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; @@ -1927,8 +2213,9 @@ GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ../; - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; + ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; }; @@ -1938,13 +2225,14 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; + CLANG_WARN_ENUM_CONVERSION = YES; CLANG_X86_VECTOR_INSTRUCTIONS = avx2; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ../; - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LLVM_VECTORIZE_LOOPS = YES; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; @@ -1955,7 +2243,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; COPY_PHASE_STRIP = NO; DSTROOT = /tmp/JFFUtils.dst; @@ -1978,7 +2265,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/JFFUtils.dst; GCC_MODEL_TUNING = G5; @@ -1997,7 +2283,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; @@ -2028,7 +2313,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; diff --git a/lib/JFFUtils/JFFUtilsTest/DateDifferenceStringFromDateTest.h b/lib/JFFUtils/JFFUtilsTest/DateDifferenceStringFromDateTest.h index e0e0e9d..622503c 100644 --- a/lib/JFFUtils/JFFUtilsTest/DateDifferenceStringFromDateTest.h +++ b/lib/JFFUtils/JFFUtilsTest/DateDifferenceStringFromDateTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface DateDifferenceStringFromDateTest : SenTestCase +@interface DateDifferenceStringFromDateTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/DateDifferenceStringFromDateTest.m b/lib/JFFUtils/JFFUtilsTest/DateDifferenceStringFromDateTest.m index 4c17a0c..42eebcf 100644 --- a/lib/JFFUtils/JFFUtilsTest/DateDifferenceStringFromDateTest.m +++ b/lib/JFFUtils/JFFUtilsTest/DateDifferenceStringFromDateTest.m @@ -19,7 +19,7 @@ - (void)testEqulatDateDifferenceDatesThrowsException NSDate *date = [_formatter dateFromString: @"2012-12-01 12:00:00"]; NSDate *fromDate = [_formatter dateFromString: @"2012-12-01 12:00:00"]; - STAssertThrows + XCTAssertThrows ( [date dateDifferenceStringFromDate: fromDate] , @"assert expected" @@ -31,7 +31,7 @@ - (void)testInvalidFromDateThrowsException NSDate *date = [_formatter dateFromString: @"2012-12-01 12:00:00"]; NSDate *fromDate = [_formatter dateFromString: @"2012-12-01 12:00:01"]; - STAssertThrows + XCTAssertThrows ( [date dateDifferenceStringFromDate: fromDate] , @"assert expected" @@ -45,7 +45,7 @@ - (void)testOneSecondDifference NSString *result = [date dateDifferenceStringFromDate: fromDate]; - STAssertEqualObjects(@"1 SECOND", result, @"date difference mismatch"); + XCTAssertEqualObjects(@"1 SECOND", result, @"date difference mismatch"); } - (void)testSeveralSecondDifference @@ -55,7 +55,7 @@ - (void)testSeveralSecondDifference NSString *result = [date dateDifferenceStringFromDate: fromDate]; - STAssertEqualObjects(@"22 SECONDS", result, @"date difference mismatch"); + XCTAssertEqualObjects(@"22 SECONDS", result, @"date difference mismatch"); } - (void)testOneMinuteDifference @@ -65,7 +65,7 @@ - (void)testOneMinuteDifference NSString *result = [date dateDifferenceStringFromDate: fromDate]; - STAssertEqualObjects(@"1 MINUTE", result, @"date difference mismatch"); + XCTAssertEqualObjects(@"1 MINUTE", result, @"date difference mismatch"); } @end diff --git a/lib/JFFUtils/JFFUtilsTest/DelegateProxyTest.h b/lib/JFFUtils/JFFUtilsTest/DelegateProxyTest.h index 8cfe010..6518b78 100644 --- a/lib/JFFUtils/JFFUtilsTest/DelegateProxyTest.h +++ b/lib/JFFUtils/JFFUtilsTest/DelegateProxyTest.h @@ -1,6 +1,6 @@ -#import +#import #import -@interface DelegateProxyTest : SenTestCase +@interface DelegateProxyTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/DelegateProxyTest.m b/lib/JFFUtils/JFFUtilsTest/DelegateProxyTest.m index c12375f..6dda787 100644 --- a/lib/JFFUtils/JFFUtilsTest/DelegateProxyTest.m +++ b/lib/JFFUtils/JFFUtilsTest/DelegateProxyTest.m @@ -104,7 +104,7 @@ - (void)performBlockWithMemoryTest:(JFFSimpleBlock)block [[self classesToTestOnLeaks]enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSNumber *num = initialInstancesCouns[idx]; - STAssertEqualObjects(num, @([obj instancesCount]), @"we got a leak"); + XCTAssertEqualObjects(num, @([obj instancesCount]), @"we got a leak"); }]; } @@ -122,7 +122,7 @@ - (void)testSetProxyDelegate object.delegate = delegate; - STAssertTrue(object.delegate != delegate, @"not the same object"); + XCTAssertTrue(object.delegate != delegate, @"not the same object"); }]; } @@ -147,9 +147,9 @@ - (void)testProxyDelegateMessageGot id sentObject = [NSObject new]; [object.delegate someDelegateMethod:sentObject]; - STAssertTrue(delegate.methodCallArgument == sentObject, @"method was called"); - STAssertTrue(proxyDelegate1.methodCallArgument == sentObject, @"method was called"); - STAssertTrue(proxyDelegate2.methodCallArgument == sentObject, @"method was called"); + XCTAssertTrue(delegate.methodCallArgument == sentObject, @"method was called"); + XCTAssertTrue(proxyDelegate1.methodCallArgument == sentObject, @"method was called"); + XCTAssertTrue(proxyDelegate2.methodCallArgument == sentObject, @"method was called"); }]; } @@ -172,7 +172,7 @@ -(void)testProxyDelegateAfterRemoveFromMemory id sentObject = [NSObject new]; [object.delegate someDelegateMethod:sentObject]; - STAssertTrue(delegate.methodCallArgument == sentObject, @"method was called"); + XCTAssertTrue(delegate.methodCallArgument == sentObject, @"method was called"); }]; } @@ -195,9 +195,9 @@ -(void)testProxyDelegateAfterRemoveFromObservers id sentObject = [NSNull null]; [object.delegate someDelegateMethod:[NSNull null]]; - STAssertTrue(delegate.methodCallArgument == sentObject, @"method was called"); + XCTAssertTrue(delegate.methodCallArgument == sentObject, @"method was called"); - STAssertTrue(object.delegate == delegate, @"method was called"); + XCTAssertTrue(object.delegate == delegate, @"method was called"); }]; } diff --git a/lib/JFFUtils/JFFUtilsTest/EmptyStringTest.h b/lib/JFFUtils/JFFUtilsTest/EmptyStringTest.h index e2d9200..a8c441c 100644 --- a/lib/JFFUtils/JFFUtilsTest/EmptyStringTest.h +++ b/lib/JFFUtils/JFFUtilsTest/EmptyStringTest.h @@ -1,5 +1,5 @@ -#import +#import -@interface EmptyStringTest : SenTestCase +@interface EmptyStringTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/EmptyStringTest.m b/lib/JFFUtils/JFFUtilsTest/EmptyStringTest.m index 558dca1..dc423b4 100644 --- a/lib/JFFUtils/JFFUtilsTest/EmptyStringTest.m +++ b/lib/JFFUtils/JFFUtilsTest/EmptyStringTest.m @@ -5,33 +5,33 @@ @implementation EmptyStringTest - (void)testNilStringIsEmpty { NSString *str; - STAssertFalse([str hasSymbols], @"Nil String[%@] should have no symbols", str); + XCTAssertFalse([str hasSymbols], @"Nil String[%@] should have no symbols", str); } - (void)testEmptyStringIsEmpty { { NSString *str = @""; - STAssertFalse([str hasSymbols], @"Nil String[%@] should have no symbols", str); + XCTAssertFalse([str hasSymbols], @"Nil String[%@] should have no symbols", str); } { NSMutableString* empty = [NSMutableString stringWithString:@""]; NSString* str = [empty copy]; - STAssertFalse([str hasSymbols], @"Nil String[%@] should have no symbols", str); + XCTAssertFalse([str hasSymbols], @"Nil String[%@] should have no symbols", str); } { NSMutableString* empty = [NSMutableString stringWithString:@""]; NSString *str = [empty copy]; - STAssertFalse( [str hasSymbols], @"Nil String[%@] should have no symbols", str); + XCTAssertFalse( [str hasSymbols], @"Nil String[%@] should have no symbols", str); } } - (void)testStringWithCharactersIsNotEmpty { NSString *str = @"abrakadabre"; - STAssertTrue([str hasSymbols], @"The String[%@] should have some symbols", str); + XCTAssertTrue([str hasSymbols], @"The String[%@] should have some symbols", str); } @end diff --git a/lib/JFFUtils/JFFUtilsTest/JFFAssignProxyTest.h b/lib/JFFUtils/JFFUtilsTest/JFFAssignProxyTest.h index 794b450..0a894e8 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFAssignProxyTest.h +++ b/lib/JFFUtils/JFFUtilsTest/JFFAssignProxyTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface JFFAssignProxyTest : SenTestCase +@interface JFFAssignProxyTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/JFFAssignProxyTest.m b/lib/JFFUtils/JFFUtilsTest/JFFAssignProxyTest.m index a1f03bc..77ed3be 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFAssignProxyTest.m +++ b/lib/JFFUtils/JFFUtilsTest/JFFAssignProxyTest.m @@ -31,7 +31,7 @@ -(void)testAssignProxyDealloc proxy = [[JFFAssignProxy alloc] initWithTarget:target]; } - STAssertTrue(targetDeallocated, @"Target should be dealloced"); + XCTAssertTrue(targetDeallocated, @"Target should be dealloced"); } -(void)testAssignProxyMethodCalls @@ -39,7 +39,7 @@ -(void)testAssignProxyMethodCalls ProxyTargetTest *target_ = [ProxyTargetTest new]; id proxy_ = [[JFFAssignProxy alloc] initWithTarget:target_ ]; - STAssertTrue( 5 == [ proxy_ justReturnFiveNumber ], @"Target should be dealloced" ); + XCTAssertTrue( 5 == [ proxy_ justReturnFiveNumber ], @"Target should be dealloced" ); } @end diff --git a/lib/JFFUtils/JFFUtilsTest/JFFMeaningClassTest.h b/lib/JFFUtils/JFFUtilsTest/JFFMeaningClassTest.h index a78962f..eee4ad6 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFMeaningClassTest.h +++ b/lib/JFFUtils/JFFUtilsTest/JFFMeaningClassTest.h @@ -1,5 +1,5 @@ -#import +#import -@interface JFFMeaningClassTest : SenTestCase +@interface JFFMeaningClassTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/JFFMeaningClassTest.m b/lib/JFFUtils/JFFUtilsTest/JFFMeaningClassTest.m index 5d75bc6..9770292 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFMeaningClassTest.m +++ b/lib/JFFUtils/JFFUtilsTest/JFFMeaningClassTest.m @@ -4,8 +4,8 @@ @implementation JFFMeaningClassTest - (void)testJffMeaningClass:(Class)aClass { - STAssertTrue([[aClass class] jffMeaningClass] == aClass, nil); - STAssertTrue([[aClass new ] jffMeaningClass] == aClass, nil); + XCTAssertTrue([[aClass class] jffMeaningClass] == aClass); + XCTAssertTrue([[aClass new ] jffMeaningClass] == aClass); } - (void)testJFFMeaningClass @@ -23,21 +23,21 @@ - (void)testJFFMeaningClass ); //fails TODO fix - //STAssertTrue( [[(__bridge id)arrayRef class] jffMeaningClass] == [NSArray class], nil); + //XCTAssertTrue( [[(__bridge id)arrayRef class] jffMeaningClass] == [NSArray class], nil); //!!! memory fail - //STAssertTrue( [[[(__bridge id)arrayRef class] new] jffMeaningClass] == [NSArray class], nil); + //XCTAssertTrue( [[[(__bridge id)arrayRef class] new] jffMeaningClass] == [NSArray class], nil); //!!! [[[(__bridge id)arrayRef mutableCopy] class] == [(__bridge id)arrayRef class] :-( - //STAssertTrue( [[[(__bridge id)arrayRef mutableCopy] class] jffMeaningClass] == [NSMutableArray class], nil); + //XCTAssertTrue( [[[(__bridge id)arrayRef mutableCopy] class] jffMeaningClass] == [NSMutableArray class], nil); // - STAssertTrue([[[@[] class] new] jffMeaningClass] == [NSArray class], nil); + XCTAssertTrue([[[@[] class] new] jffMeaningClass] == [NSArray class]); - STAssertTrue( [[@[] class] jffMeaningClass] == [NSArray class], nil); - STAssertTrue([[[@[] class] new] jffMeaningClass] == [NSArray class], nil); + XCTAssertTrue( [[@[] class] jffMeaningClass] == [NSArray class]); + XCTAssertTrue([[[@[] class] new] jffMeaningClass] == [NSArray class]); - STAssertTrue( [[[@[] mutableCopy] class] jffMeaningClass] == [NSMutableArray class], nil); - STAssertTrue([[[[@[] mutableCopy] class] new] jffMeaningClass] == [NSMutableArray class], nil); + XCTAssertTrue( [[[@[] mutableCopy] class] jffMeaningClass] == [NSMutableArray class]); + XCTAssertTrue([[[[@[] mutableCopy] class] new] jffMeaningClass] == [NSMutableArray class]); CFRelease(arrayRef); } @@ -54,24 +54,24 @@ - (void)testJFFMeaningClass NULL ); - STAssertTrue( [[(__bridge id)dictRef class] jffMeaningClass] == [NSDictionary class], nil); + XCTAssertTrue( [[(__bridge id)dictRef class] jffMeaningClass] == [NSDictionary class]); //!!! runtime fail - //STAssertTrue( [[[(__bridge id)dictRef class] new] jffMeaningClass] == [NSDictionary class], nil); + //XCTAssertTrue( [[[(__bridge id)dictRef class] new] jffMeaningClass] == [NSDictionary class], nil); //!!! - //STAssertTrue( [[[(__bridge id)dictRef mutableCopy] class] jffMeaningClass] == [NSDictionary class], nil); + //XCTAssertTrue( [[[(__bridge id)dictRef mutableCopy] class] jffMeaningClass] == [NSDictionary class], nil); CFRelease(dictRef); NSMutableDictionary *dict = [NSMutableDictionary new]; - STAssertTrue( [[[dict copy] class] jffMeaningClass] == [NSDictionary class], nil); + XCTAssertTrue( [[[dict copy] class] jffMeaningClass] == [NSDictionary class]); - STAssertTrue( [[@{} class] jffMeaningClass] == [NSDictionary class], nil); + XCTAssertTrue( [[@{} class] jffMeaningClass] == [NSDictionary class]); //!!! runtime fail when call new for [[@{} mutableCopy] class] -// STAssertTrue([[[@{} class] new] jffMeaningClass] == [NSDictionary class], nil); +// XCTAssertTrue([[[@{} class] new] jffMeaningClass] == [NSDictionary class], nil); //!!! [[[@{} mutableCopy] class] == [@{} class] :-( -// STAssertTrue( [[[@{} mutableCopy] class] jffMeaningClass] == [NSMutableDictionary class], nil); -// STAssertTrue([[[[@{} mutableCopy] class] new] jffMeaningClass] == [NSMutableDictionary class], nil); +// XCTAssertTrue( [[[@{} mutableCopy] class] jffMeaningClass] == [NSMutableDictionary class], nil); +// XCTAssertTrue([[[[@{} mutableCopy] class] new] jffMeaningClass] == [NSMutableDictionary class], nil); } { @@ -82,24 +82,24 @@ - (void)testJFFMeaningClass kCFStringEncodingUTF8 ); - STAssertTrue( [[(__bridge id)stringRef class] jffMeaningClass] == [NSString class], nil); + XCTAssertTrue( [[(__bridge id)stringRef class] jffMeaningClass] == [NSString class]); CFRelease(stringRef); - STAssertTrue( [[@"a" class] jffMeaningClass] == [NSString class], nil); - STAssertTrue( [[[@"a" class] new] jffMeaningClass] == [NSString class], nil); + XCTAssertTrue( [[@"a" class] jffMeaningClass] == [NSString class]); + XCTAssertTrue( [[[@"a" class] new] jffMeaningClass] == [NSString class]); //!!! the same as empty CFString -// STAssertTrue( [[[@"" mutableCopy] class] jffMeaningClass] == [NSMutableString class], nil); +// XCTAssertTrue( [[[@"" mutableCopy] class] jffMeaningClass] == [NSMutableString class], nil); //!!! runtime fail when call new for [[@"" mutableCopy] class] -// STAssertTrue([[[[@"" mutableCopy] class] new] jffMeaningClass] == [NSMutableString class], nil); +// XCTAssertTrue([[[[@"" mutableCopy] class] new] jffMeaningClass] == [NSMutableString class], nil); } { - STAssertTrue( [[@1 class] jffMeaningClass] == [NSNumber class], nil); + XCTAssertTrue( [[@1 class] jffMeaningClass] == [NSNumber class]); //!!! strange fails :-( -// STAssertTrue( [[[[@1 class] alloc] initWithBool:NO] jffMeaningClass] == [NSString class], nil); +// XCTAssertTrue( [[[[@1 class] alloc] initWithBool:NO] jffMeaningClass] == [NSString class], nil); const double value; CFNumberRef numberRef = CFNumberCreate ( @@ -108,9 +108,9 @@ - (void)testJFFMeaningClass &value ); - STAssertTrue( [[(__bridge id)numberRef class] jffMeaningClass] == [NSNumber class], nil); + XCTAssertTrue( [[(__bridge id)numberRef class] jffMeaningClass] == [NSNumber class]); //!!! strange fails :-( -// STAssertTrue( [[[[(__bridge id)numberRef class] alloc] initWithBool:NO] jffMeaningClass] == [NSNumber class], nil); +// XCTAssertTrue( [[[[(__bridge id)numberRef class] alloc] initWithBool:NO] jffMeaningClass] == [NSNumber class], nil); CFRelease(numberRef); diff --git a/lib/JFFUtils/JFFUtilsTest/JFFMulticastDelegateTest.h b/lib/JFFUtils/JFFUtilsTest/JFFMulticastDelegateTest.h index 3666deb..b524cfa 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFMulticastDelegateTest.h +++ b/lib/JFFUtils/JFFUtilsTest/JFFMulticastDelegateTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface JFFMulticastDelegateTest : SenTestCase +@interface JFFMulticastDelegateTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/JFFMulticastDelegateTest.m b/lib/JFFUtils/JFFUtilsTest/JFFMulticastDelegateTest.m index 4b49b8d..3c26e5d 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFMulticastDelegateTest.m +++ b/lib/JFFUtils/JFFUtilsTest/JFFMulticastDelegateTest.m @@ -9,7 +9,7 @@ - (NSUInteger)justReturnFiveNumber; @interface TestClassForMulticast : NSObject < TestMulticastDelegateInterface > -@property ( nonatomic, unsafe_unretained ) NSUInteger initialState; +@property (nonatomic, unsafe_unretained) NSUInteger initialState; @end @@ -44,11 +44,11 @@ - (void)testMutableAssignArrayAssignIssue [multicast addDelegate:delegate]; - STAssertTrue( initState_ == [ multicast justReturnFiveNumber ], @"Contains 1 object" ); + XCTAssertTrue( initState_ == [ multicast justReturnFiveNumber ], @"Contains 1 object" ); } - STAssertTrue( delegateDeallocated, @"Target should be dealloced" ); - STAssertTrue( 0 == [ multicast justReturnFiveNumber ], @"Empty array" ); + XCTAssertTrue( delegateDeallocated, @"Target should be dealloced" ); + XCTAssertTrue( 0 == [ multicast justReturnFiveNumber ], @"Empty array" ); } - (void)testMulticastDelegateFirstRelease @@ -66,7 +66,7 @@ - (void)testMulticastDelegateFirstRelease [multicast addDelegate:delegate]; } - STAssertTrue( multicast_deallocated_, @"Target should be dealloced" ); + XCTAssertTrue( multicast_deallocated_, @"Target should be dealloced" ); } - (void)testAddDelegateTwice @@ -79,7 +79,7 @@ - (void)testAddDelegateTwice [multicast addDelegate:delegate]; - STAssertTrue(5 == [multicast justReturnFiveNumber], @"Contains 1 object"); + XCTAssertTrue(5 == [multicast justReturnFiveNumber], @"Contains 1 object"); } @end diff --git a/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignArrayTest.h b/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignArrayTest.h index 4a5161a..fc86ce4 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignArrayTest.h +++ b/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignArrayTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface JFFMutableAssignArrayTest : SenTestCase +@interface JFFMutableAssignArrayTest : XCTestCase @end \ No newline at end of file diff --git a/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignArrayTest.m b/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignArrayTest.m index b1181fb..39a16b9 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignArrayTest.m +++ b/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignArrayTest.m @@ -17,12 +17,12 @@ - (void)testMutableAssignArrayAssignIssue JFFMutableAssignArray *array = [JFFMutableAssignArray new]; [array addObject:target]; - STAssertTrue(1 == [array count], @"Contains 1 object"); + XCTAssertTrue(1 == [array count], @"Contains 1 object"); } - STAssertNil(weakTarget, @"Target should be dealloced"); + XCTAssertNil(weakTarget, @"Target should be dealloced"); } - STAssertTrue(0 == [array count], @"Empty array"); + XCTAssertTrue(0 == [array count], @"Empty array"); } - (void)testMutableAssignArrayFirstRelease @@ -37,7 +37,7 @@ - (void)testMutableAssignArrayFirstRelease [array addObject:target]; } - STAssertNil(weakArray, @"Target should be dealloced"); + XCTAssertNil(weakArray, @"Target should be dealloced"); } - (void)testLastObject @@ -47,7 +47,7 @@ - (void)testLastObject NSObject *object = [NSObject new]; [array addObject:object]; - STAssertTrue(object == [array lastObject], @"Target should be dealloced"); + XCTAssertTrue(object == [array lastObject], @"Target should be dealloced"); } - (void)testContainsObject @@ -69,13 +69,13 @@ - (void)testContainsObject NSObject *object2 = [NSObject new]; [array addObject: object1]; - STAssertTrue ([array containsObject:object1], @"Array contains object1" ); - STAssertFalse([array containsObject:object2], @"Array no contains object2"); + XCTAssertTrue ([array containsObject:object1], @"Array contains object1" ); + XCTAssertFalse([array containsObject:object2], @"Array no contains object2"); } - STAssertTrue(onDeallocBlockCalled, @"EonDeallocBlock called"); - STAssertTrue(0 == [array count], @"Empty array"); - STAssertNil(object1Ptr, @"Empty array"); + XCTAssertTrue(onDeallocBlockCalled, @"EonDeallocBlock called"); + XCTAssertTrue(0 == [array count], @"Empty array"); + XCTAssertNil(object1Ptr, @"Empty array"); } } diff --git a/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignDictionaryTest.h b/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignDictionaryTest.h index ff38477..e2c95f8 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignDictionaryTest.h +++ b/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignDictionaryTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface JFFMutableAssignDictionaryTest : SenTestCase +@interface JFFMutableAssignDictionaryTest : XCTestCase @end \ No newline at end of file diff --git a/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignDictionaryTest.m b/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignDictionaryTest.m index acecfba..89787e2 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignDictionaryTest.m +++ b/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignDictionaryTest.m @@ -21,14 +21,14 @@ - (void)testMutableAssignDictionaryAssignIssue dict2 = [JFFMutableAssignDictionary new]; [dict2 setObject:target forKey:@"1"]; [dict2 setObject:target forKey:@"2"]; - - STAssertTrue(1 == [dict1 count], @"Contains 1 object"); - STAssertTrue(2 == [dict2 count], @"Contains 1 object"); + + XCTAssertTrue(1 == [dict1 count], @"Contains 1 object"); + XCTAssertTrue(2 == [dict2 count], @"Contains 1 object"); } - STAssertTrue(targetDeallocated, @"Target should be dealloced"); - STAssertTrue(0 == [dict1 count], @"Empty array"); - STAssertTrue(0 == [dict2 count], @"Empty array"); + XCTAssertTrue(targetDeallocated, @"Target should be dealloced"); + XCTAssertTrue(0 == [dict1 count], @"Empty array"); + XCTAssertTrue(0 == [dict2 count], @"Empty array"); } - (void)testMutableAssignDictionaryFirstRelease @@ -58,8 +58,8 @@ - (void)testMutableAssignDictionaryFirstRelease dict2[@"2"] = target; } - STAssertTrue(dictDeallocated1, @"Target should be dealloced"); - STAssertTrue(dictDeallocated2, @"Target should be dealloced"); + XCTAssertTrue(dictDeallocated1, @"Target should be dealloced"); + XCTAssertTrue(dictDeallocated2, @"Target should be dealloced"); } } @@ -80,29 +80,29 @@ -(void)testObjectForKey [dict setObject:object1 forKey:@"1"]; [dict setObject:object2 forKey:@"2"]; - STAssertTrue(dict[@"1" ] == object1, @"Dict contains object_"); - STAssertTrue(dict[@"2" ] == object2, @"Dict contains object_"); - STAssertTrue(dict[@"3" ] == nil, @"Dict no contains object for key \"2\""); + XCTAssertTrue(dict[@"1" ] == object1, @"Dict contains object_"); + XCTAssertTrue(dict[@"2" ] == object2, @"Dict contains object_"); + XCTAssertTrue(dict[@"3" ] == nil, @"Dict no contains object for key \"2\""); __block NSUInteger count = 0; [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { - if ([ key isEqualToString:@"1"]) { - STAssertTrue(obj == object1, nil); + if ( [ key isEqualToString: @"1" ] ) { + XCTAssertTrue(obj == object1); ++count; } else if ([key isEqualToString:@"2"]) { - STAssertTrue(obj == object2, nil); + XCTAssertTrue(obj == object2); ++count; } else { - STFail( @"should not be reached" ); + XCTFail( @"should not be reached" ); } } ]; - STAssertTrue( count == 2, @"Dict no contains object for key \"2\"" ); + XCTAssertTrue( count == 2, @"Dict no contains object for key \"2\"" ); } - STAssertTrue(target_deallocated, @"Target should be dealloced"); - STAssertTrue(0 == [dict count], @"Empty dict"); + XCTAssertTrue(target_deallocated, @"Target should be dealloced"); + XCTAssertTrue(0 == [dict count], @"Empty dict"); } } @@ -124,20 +124,20 @@ -(void)testReplaceObjectInDict dict[@"1"] = replacedObject; - STAssertTrue(dict[@"1"] == replacedObject, @"Dict contains object_"); - STAssertTrue(dict[@"2"] == nil, @"Dict no contains object for key \"2\""); + XCTAssertTrue(dict[@"1"] == replacedObject, @"Dict contains object_"); + XCTAssertTrue(dict[@"2"] == nil, @"Dict no contains object for key \"2\""); dict[@"1"] = object; - STAssertTrue([dict objectForKey:@"1"] == object, @"Dict contains object_"); + XCTAssertTrue([dict objectForKey:@"1"] == object, @"Dict contains object_"); } - STAssertTrue(replacedObjectDealloced, nil); + XCTAssertTrue(replacedObjectDealloced); NSObject *currentObject = [dict objectForKey:@"1"]; - STAssertTrue(currentObject == object, nil); + XCTAssertTrue(currentObject == object); } - STAssertTrue(0 == [dict count], @"Empty dict"); + XCTAssertTrue(0 == [dict count], @"Empty dict"); } - (void)testMapMethod @@ -153,23 +153,23 @@ - (void)testMapMethod return @(num * [key integerValue]); }]; - STAssertTrue([result count] == 3, nil); + XCTAssertTrue([result count] == 3); if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 6.) - STAssertFalse([result isKindOfClass:[NSMutableDictionary class]], nil); - STAssertTrue([result isKindOfClass:[NSDictionary class]], nil); + XCTAssertFalse([result isKindOfClass:[NSMutableDictionary class]]); + XCTAssertTrue([result isKindOfClass:[NSDictionary class]]); - STAssertEqualObjects(@1, result[@"1"], nil); - STAssertEqualObjects(@4, result[@"2"], nil); - STAssertEqualObjects(@9, result[@"3"], nil); + XCTAssertEqualObjects(@1, result[@"1"]); + XCTAssertEqualObjects(@4, result[@"2"]); + XCTAssertEqualObjects(@9, result[@"3"]); - STAssertThrows({ + XCTAssertThrows({ [dict map:^id(id key, id object) { NSUInteger num = [object unsignedIntegerValue]; if (num == 3) return nil; return @(num * 2); }]; - }, nil); + }); } - (void)testEnumerateKeysAndObjectsUsingBlock @@ -192,11 +192,11 @@ - (void)testEnumerateKeysAndObjectsUsingBlock [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { ++count; resultDict[key] = obj; - STAssertEqualObjects(obj, patternDict[key], nil); + XCTAssertEqualObjects(obj, patternDict[key]); }]; - STAssertTrue(count == 3, nil); - STAssertEqualObjects(resultDict, patternDict, nil); + XCTAssertTrue(count == 3); + XCTAssertEqualObjects(resultDict, patternDict); count = 0; @@ -206,7 +206,7 @@ - (void)testEnumerateKeysAndObjectsUsingBlock *stop = YES; }]; - STAssertTrue(count == 2, nil); + XCTAssertTrue(count == 2); } @end diff --git a/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignKeyDictionaryTest.h b/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignKeyDictionaryTest.h index ed74fc7..504519c 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignKeyDictionaryTest.h +++ b/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignKeyDictionaryTest.h @@ -1,7 +1,4 @@ -#import - -#import - -@interface JFFMutableAssignKeyDictionaryTest : SenTestCase +#import +@interface JFFMutableAssignKeyDictionaryTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignKeyDictionaryTest.m b/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignKeyDictionaryTest.m index ae05b0f..b473b98 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignKeyDictionaryTest.m +++ b/lib/JFFUtils/JFFUtilsTest/JFFMutableAssignKeyDictionaryTest.m @@ -29,13 +29,13 @@ -(void)testMutableAssignDictionaryAssignIssue dict2[target] = [NSObject new]; dict2[target] = [NSObject new]; - STAssertTrue(1 == [dict1 count], @"Contains 1 object"); - STAssertTrue(1 == [dict2 count], @"Contains 1 object"); + XCTAssertTrue(1 == [dict1 count], @"Contains 1 object"); + XCTAssertTrue(1 == [dict2 count], @"Contains 1 object"); } - STAssertTrue(targetDeallocated, @"Target should be dealloced"); - STAssertTrue(0 == [dict1 count], @"Empty array"); - STAssertTrue(0 == [dict2 count], @"Empty array"); + XCTAssertTrue(targetDeallocated, @"Target should be dealloced"); + XCTAssertTrue(0 == [dict1 count], @"Empty array"); + XCTAssertTrue(0 == [dict2 count], @"Empty array"); } - (void)testMutableAssignDictionaryFirstRelease @@ -66,8 +66,8 @@ - (void)testMutableAssignDictionaryFirstRelease dict2[target] = [NSObject new]; } - STAssertTrue(dictDeallocated1, @"Target should be dealloced"); - STAssertTrue(dictDeallocated2, @"Target should be dealloced"); + XCTAssertTrue(dictDeallocated1, @"Target should be dealloced"); + XCTAssertTrue(dictDeallocated2, @"Target should be dealloced"); } } @@ -94,29 +94,29 @@ -(void)testObjectForKey dict[key1] = object1; [dict setObject:object2 forKey:key2]; - STAssertTrue(dict[key1] == object1, @"Dict contains object_"); - STAssertTrue(dict[key2] == object2, @"Dict contains object_"); - STAssertTrue(dict[key3] == nil, @"Dict no contains object for key \"2\""); + XCTAssertTrue(dict[key1] == object1, @"Dict contains object_"); + XCTAssertTrue(dict[key2] == object2, @"Dict contains object_"); + XCTAssertTrue(dict[key3] == nil, @"Dict no contains object for key \"2\""); __block NSUInteger count = 0; [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { if ([key isEqual:key1]) { - STAssertTrue(obj == object1, nil); + XCTAssertTrue(obj == object1, @"pointers must be equal" ); ++count; } else if ([key isEqual:key2]) { - STAssertTrue(obj == object2, nil); + XCTAssertTrue(obj == object2, @"pointers must be equal"); ++count; } else { - STFail( @"should not be reached" ); + XCTFail( @"should not be reached" ); } }]; - STAssertTrue(count == 2, @"Dict no contains object for key \"2\""); + XCTAssertTrue(count == 2, @"Dict no contains object for key \"2\""); } - STAssertTrue(targetDeallocated, @"Target should be dealloced"); - STAssertTrue(0 == [dict count], @"Empty dict"); + XCTAssertTrue(targetDeallocated, @"Target should be dealloced"); + XCTAssertTrue(0 == [dict count], @"Empty dict"); } } @@ -138,26 +138,26 @@ - (void)testMapMethod return @(num * [key integerValue]); }]; - STAssertTrue([result count] == 3, nil); + XCTAssertTrue([result count] == 3, @"count mismatch"); if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 6.) { - STAssertFalse([result isKindOfClass:[NSMutableDictionary class]], nil); + XCTAssertFalse([result isKindOfClass:[NSMutableDictionary class]], @"dictionary class mismatch"); } - STAssertTrue([result isKindOfClass:[NSDictionary class]], nil); + XCTAssertTrue([result isKindOfClass:[NSDictionary class]], @"dictionary class mismatch"); - STAssertEqualObjects(@1, result[key1], nil); - STAssertEqualObjects(@4, result[key2], nil); - STAssertEqualObjects(@9, result[key3], nil); + XCTAssertEqualObjects(@1, result[key1], @"key1 mismatch"); + XCTAssertEqualObjects(@4, result[key2], @"key2 mismatch"); + XCTAssertEqualObjects(@9, result[key3], @"key3 mismatch"); - STAssertThrows({ + XCTAssertThrows({ [dict map:^id(id key, id object) { NSUInteger num = [object unsignedIntegerValue]; if (num == 3) return nil; return @(num * 2); }]; - }, nil); + }, @"assert expected"); } - (void)testEnumerateKeysAndObjectsUsingBlock @@ -185,11 +185,11 @@ - (void)testEnumerateKeysAndObjectsUsingBlock [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { ++count; resultDict[key] = obj; - STAssertEqualObjects(obj, patternDict[key], nil); + XCTAssertEqualObjects(obj, patternDict[key], @"incorrect pattern match"); }]; - STAssertTrue(count == 3, nil); - STAssertEqualObjects(resultDict, patternDict, nil); + XCTAssertTrue(count == 3, @"incorrect pattern count"); + XCTAssertEqualObjects(resultDict, patternDict, @"incorrect pattern dict"); count = 0; @@ -199,7 +199,7 @@ - (void)testEnumerateKeysAndObjectsUsingBlock *stop = YES; }]; - STAssertTrue(count == 2, nil); + XCTAssertTrue(count == 2, @"incorrect pattern count"); } @end diff --git a/lib/JFFUtils/JFFUtilsTest/JFFOnDeallocBlockOwnerTest.h b/lib/JFFUtils/JFFUtilsTest/JFFOnDeallocBlockOwnerTest.h index 0c988fb..0619fc4 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFOnDeallocBlockOwnerTest.h +++ b/lib/JFFUtils/JFFUtilsTest/JFFOnDeallocBlockOwnerTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface JFFOnDeallocBlockOwnerTest : SenTestCase +@interface JFFOnDeallocBlockOwnerTest : XCTestCase @end \ No newline at end of file diff --git a/lib/JFFUtils/JFFUtilsTest/JFFOnDeallocBlockOwnerTest.m b/lib/JFFUtils/JFFUtilsTest/JFFOnDeallocBlockOwnerTest.m index f69c495..9078d0d 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFOnDeallocBlockOwnerTest.m +++ b/lib/JFFUtils/JFFUtilsTest/JFFOnDeallocBlockOwnerTest.m @@ -20,12 +20,12 @@ - (void)testOnDeallocBlockOwnerBehavior blockCalled = YES; } ]; - STAssertFalse(blockContextDeallocated && owner, @"Block context should not be dealloced"); - STAssertFalse(blockCalled, @"block should not be called here"); + XCTAssertFalse(blockContextDeallocated && owner, @"Block context should not be dealloced"); + XCTAssertFalse(blockCalled, @"block should not be called here"); } - STAssertTrue(blockContextDeallocated, @"Block context should be dealloced"); - STAssertTrue(blockCalled, @"block should be called here"); + XCTAssertTrue(blockContextDeallocated, @"Block context should be dealloced"); + XCTAssertTrue(blockCalled, @"block should be called here"); } - (void)testDoNotCallOnDeallocBlockAfterRemoveIt @@ -41,12 +41,12 @@ - (void)testDoNotCallOnDeallocBlockAfterRemoveIt [owner addOnDeallocBlock:onDeallocBloc]; - STAssertFalse(blockCalled, nil); + XCTAssertFalse(blockCalled); [owner removeOnDeallocBlock:onDeallocBloc]; } - STAssertFalse(blockCalled, nil); + XCTAssertFalse(blockCalled); } @end diff --git a/lib/JFFUtils/JFFUtilsTest/JFFRuntimeAddiotionsTest.h b/lib/JFFUtils/JFFUtilsTest/JFFRuntimeAddiotionsTest.h index 5abc5cb..843fa3b 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFRuntimeAddiotionsTest.h +++ b/lib/JFFUtils/JFFUtilsTest/JFFRuntimeAddiotionsTest.h @@ -1,5 +1,5 @@ -#import +#import -@interface JFFRuntimeAddiotionsTest : SenTestCase +@interface JFFRuntimeAddiotionsTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/JFFRuntimeAddiotionsTest.m b/lib/JFFUtils/JFFUtilsTest/JFFRuntimeAddiotionsTest.m index 7ff87c3..3b98293 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFRuntimeAddiotionsTest.m +++ b/lib/JFFUtils/JFFUtilsTest/JFFRuntimeAddiotionsTest.m @@ -28,7 +28,7 @@ - (void)testWeakOwnerDynamicProperty { TestWeakOwnerClass *owner = [TestWeakOwnerClass new]; - STAssertNil(owner.dynamicWeakOwnedObject, nil); + XCTAssertNil(owner.dynamicWeakOwnedObject, @"memory leak"); @autoreleasepool { @@ -36,14 +36,14 @@ - (void)testWeakOwnerDynamicProperty NSObject *owned2 = [NSObject new]; owner.dynamicWeakOwnedObject = owned; - STAssertNotNil(owner.dynamicWeakOwnedObject, nil); + XCTAssertNotNil(owner.dynamicWeakOwnedObject, @"memory leak"); owner.normalWeakOwnedObject = owned2; - STAssertNotNil(owner.normalWeakOwnedObject, nil); + XCTAssertNotNil(owner.normalWeakOwnedObject, @"memory management issue"); } - STAssertNil(owner.dynamicWeakOwnedObject, nil); - STAssertNil(owner.normalWeakOwnedObject, nil); + XCTAssertNil(owner.dynamicWeakOwnedObject, @"memory leak"); + XCTAssertNil(owner.normalWeakOwnedObject, @"memory leak"); } @autoreleasepool @@ -53,10 +53,10 @@ - (void)testWeakOwnerDynamicProperty @autoreleasepool { TestWeakOwnerClass *owner = [TestWeakOwnerClass new]; - STAssertNil(owner.dynamicWeakOwnedObject, nil); + XCTAssertNil(owner.dynamicWeakOwnedObject, @"memory leak"); owner.dynamicWeakOwnedObject = owned; - STAssertNotNil(owner.dynamicWeakOwnedObject, nil); + XCTAssertNotNil(owner.dynamicWeakOwnedObject, @"memory leak"); } } } diff --git a/lib/JFFUtils/JFFUtilsTest/JFFSimpleBlockHolderTest.h b/lib/JFFUtils/JFFUtilsTest/JFFSimpleBlockHolderTest.h index 44e7904..1b43c31 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFSimpleBlockHolderTest.h +++ b/lib/JFFUtils/JFFUtilsTest/JFFSimpleBlockHolderTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface JFFSimpleBlockHolderTest : SenTestCase +@interface JFFSimpleBlockHolderTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/JFFSimpleBlockHolderTest.m b/lib/JFFUtils/JFFUtilsTest/JFFSimpleBlockHolderTest.m index c3914f7..390baff 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFSimpleBlockHolderTest.m +++ b/lib/JFFUtils/JFFUtilsTest/JFFSimpleBlockHolderTest.m @@ -10,8 +10,8 @@ -(void)setUp -(void)testSimpleBlockHolderBehavior { @autoreleasepool { - JFFSimpleBlockHolder* holder = [ JFFSimpleBlockHolder new ]; - STAssertTrue( 0 != [ JFFSimpleBlockHolder instancesCount ], @"Block holder should exists" ); + JFFSimpleBlockHolder *holder = [JFFSimpleBlockHolder new]; + XCTAssertTrue( 0 != [ JFFSimpleBlockHolder instancesCount ], @"Block holder should exists" ); __block BOOL blockContextDeallocated = NO; __block NSUInteger performBlockCount = 0; @@ -36,12 +36,12 @@ -(void)testSimpleBlockHolderBehavior holder.onceSimpleBlock(); } - STAssertTrue(blockContextDeallocated, @"Block context should be dealloced"); - STAssertTrue(1 == performBlockCount, @"Block was called once"); - STAssertTrue(nil == holder.simpleBlock, @"Block is nil after call"); + XCTAssertTrue(blockContextDeallocated, @"Block context should be dealloced"); + XCTAssertTrue(1 == performBlockCount, @"Block was called once"); + XCTAssertTrue(nil == holder.simpleBlock, @"Block is nil after call"); } - STAssertTrue( 0 == [ JFFSimpleBlockHolder instancesCount ], @"Block holder should be dealloced" ); + XCTAssertTrue( 0 == [ JFFSimpleBlockHolder instancesCount ], @"Block holder should be dealloced" ); } @end diff --git a/lib/JFFUtils/JFFUtilsTest/JFFStringFormatTest.h b/lib/JFFUtils/JFFUtilsTest/JFFStringFormatTest.h index 7eca27c..f327ef5 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFStringFormatTest.h +++ b/lib/JFFUtils/JFFUtilsTest/JFFStringFormatTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface JFFStringFormatTest : SenTestCase +@interface JFFStringFormatTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/JFFStringFormatTest.m b/lib/JFFUtils/JFFUtilsTest/JFFStringFormatTest.m index ec59220..c2de1d9 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFStringFormatTest.m +++ b/lib/JFFUtils/JFFUtilsTest/JFFStringFormatTest.m @@ -9,7 +9,7 @@ - (void)testNotAllParamsPresent NSString *param2 = @"2"; NSString *result = [NSString stringWithFormatCheckNill:format, param1, param2, nil]; - STAssertTrue(result != nil, @"Should NOT be nil value"); + XCTAssertTrue(result != nil, @"Should NOT be nil value"); } - (void)testOneMoreParam @@ -20,7 +20,7 @@ - (void)testOneMoreParam NSString *param3 = @"3"; NSString *result = [NSString stringWithFormatCheckNill:format, param1, param2, param3, nil]; - STAssertTrue(result != nil, @"Should NOT be nil value"); + XCTAssertTrue(result != nil, @"Should NOT be nil value"); } @end diff --git a/lib/JFFUtils/JFFUtilsTest/JFFUtilsTest-Info.plist b/lib/JFFUtils/JFFUtilsTest/JFFUtilsTest-Info.plist index b80638c..69e7088 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFUtilsTest-Info.plist +++ b/lib/JFFUtils/JFFUtilsTest/JFFUtilsTest-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.EmbeddedSources.${PRODUCT_NAME:rfc1034identifier} + org.iAsync.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType diff --git a/lib/JFFUtils/JFFUtilsTest/JFFUtilsTest-Prefix.pch b/lib/JFFUtils/JFFUtilsTest/JFFUtilsTest-Prefix.pch index 2451aaa..e0203b6 100644 --- a/lib/JFFUtils/JFFUtilsTest/JFFUtilsTest-Prefix.pch +++ b/lib/JFFUtils/JFFUtilsTest/JFFUtilsTest-Prefix.pch @@ -1,10 +1,12 @@ // -// Prefix header for all source files of the 'JFFUtilsTest' target in the 'JFFUtilsTest' project +// Prefix header +// +// The contents of this file are implicitly included at the beginning of every source file. // #ifdef __OBJC__ - #import #import + #import #import #import diff --git a/lib/JFFUtils/JFFUtilsTest/JUArrayAdditionsTest.h b/lib/JFFUtils/JFFUtilsTest/JUArrayAdditionsTest.h index 018d2f8..c46b1dc 100644 --- a/lib/JFFUtils/JFFUtilsTest/JUArrayAdditionsTest.h +++ b/lib/JFFUtils/JFFUtilsTest/JUArrayAdditionsTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface JUArrayAdditionsTest : SenTestCase +@interface JUArrayAdditionsTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/JUArrayAdditionsTest.m b/lib/JFFUtils/JFFUtilsTest/JUArrayAdditionsTest.m index 972d5f4..5545bb6 100644 --- a/lib/JFFUtils/JFFUtilsTest/JUArrayAdditionsTest.m +++ b/lib/JFFUtils/JFFUtilsTest/JUArrayAdditionsTest.m @@ -24,7 +24,7 @@ -(void)testIsEqualVersionWorksCorrectly , @"habra" , @"ABra"]; - STAssertTrue( [ received isEqualToArray: expected ], @"Arrays mismatch" ); + XCTAssertTrue( [ received isEqualToArray: expected ], @"Arrays mismatch" ); } { @@ -44,7 +44,7 @@ -(void)testIsEqualVersionWorksCorrectly , @"four" , @"five" ]; - STAssertTrue( [ received isEqualToArray: expected ], @"Arrays mismatch" ); + XCTAssertTrue( [ received isEqualToArray: expected ], @"Arrays mismatch" ); } } @@ -60,7 +60,7 @@ -(void)testIsEqualVersionWorksWithEmptyArray received = [items unique]; expected = items; - STAssertTrue( [ received isEqualToArray: expected], @"Arrays mismatch" ); + XCTAssertTrue( [ received isEqualToArray: expected], @"Arrays mismatch" ); } } @@ -97,7 +97,7 @@ -(void)testBlockVersionWorksCorrectly , @"kadabra" , @"habra" ]; - STAssertTrue( [ received_ isEqualToArray: expected_ ], @"Arrays mismatch" ); + XCTAssertTrue( [ received_ isEqualToArray: expected_ ], @"Arrays mismatch" ); } { @@ -117,7 +117,7 @@ -(void)testBlockVersionWorksCorrectly , @"four" , @"five" ]; - STAssertTrue( [ received_ isEqualToArray: expected_ ], @"Arrays mismatch" ); + XCTAssertTrue( [ received_ isEqualToArray: expected_ ], @"Arrays mismatch" ); } } diff --git a/lib/JFFUtils/JFFUtilsTest/JUMutableArrayTest.h b/lib/JFFUtils/JFFUtilsTest/JUMutableArrayTest.h index ad0c391..e344190 100644 --- a/lib/JFFUtils/JFFUtilsTest/JUMutableArrayTest.h +++ b/lib/JFFUtils/JFFUtilsTest/JUMutableArrayTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface JUMutableArrayTest : SenTestCase +@interface JUMutableArrayTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/JUMutableArrayTest.m b/lib/JFFUtils/JFFUtilsTest/JUMutableArrayTest.m index c2a12dd..8b6a04c 100644 --- a/lib/JFFUtils/JFFUtilsTest/JUMutableArrayTest.m +++ b/lib/JFFUtils/JFFUtilsTest/JUMutableArrayTest.m @@ -6,12 +6,12 @@ -(void)testEmptyArrayRemainsEmptyOnShrink { NSMutableArray* items_ = [ @[] mutableCopy ]; - STAssertNotNil( items_ , @"Array should be empty" ); - STAssertTrue ( 0 == [ items_ count ], @"Array should be empty" ); + XCTAssertNotNil( items_ , @"Array should be empty" ); + XCTAssertTrue ( 0 == [ items_ count ], @"Array should be empty" ); [ items_ shrinkToSize: 234 ]; - STAssertNotNil( items_ , @"Array should be empty" ); - STAssertTrue ( 0 == [ items_ count ], @"Array should be empty" ); + XCTAssertNotNil( items_ , @"Array should be empty" ); + XCTAssertTrue ( 0 == [ items_ count ], @"Array should be empty" ); } -(void)testArrayBecomesEmptyForZeroArg @@ -24,12 +24,12 @@ -(void)testArrayBecomesEmptyForZeroArg , @"six" , @"seven" ] mutableCopy ]; - STAssertNotNil( items_ , @"Array should be valid" ); - STAssertTrue ( 7 == [ items_ count ], @"Array should have 7 items" ); + XCTAssertNotNil( items_ , @"Array should be valid" ); + XCTAssertTrue ( 7 == [ items_ count ], @"Array should have 7 items" ); [ items_ shrinkToSize: 0 ]; - STAssertNotNil( items_ , @"Array should be empty" ); - STAssertTrue ( 0 == [ items_ count ], @"Array should be empty" ); + XCTAssertNotNil( items_ , @"Array should be empty" ); + XCTAssertTrue ( 0 == [ items_ count ], @"Array should be empty" ); } -(void)testArrayDoesNotGrowOnShrinks @@ -45,14 +45,14 @@ -(void)testArrayDoesNotGrowOnShrinks , @"six" , @"seven" ] mutableCopy ]; - STAssertNotNil( items_ , @"Array should be valid" ); - STAssertTrue ( 7 == [ items_ count ], @"Array should have 7 items" ); + XCTAssertNotNil( items_ , @"Array should be valid" ); + XCTAssertTrue ( 7 == [ items_ count ], @"Array should have 7 items" ); [ items_ shrinkToSize: 100 ]; - STAssertNotNil( items_ , @"Array should be valid" ); - STAssertTrue ( 7 == [ items_ count ], @"Array should have 7 items" ); + XCTAssertNotNil( items_ , @"Array should be valid" ); + XCTAssertTrue ( 7 == [ items_ count ], @"Array should have 7 items" ); - STAssertTrue( [ [ items_ lastObject ] isEqualToString: @"seven" ], @"Last item mismatch" ); + XCTAssertTrue( [ [ items_ lastObject ] isEqualToString: @"seven" ], @"Last item mismatch" ); } } @@ -68,15 +68,15 @@ -(void)testArrayShrinksCorrectly , @"five" , @"six" , @"seven" ] mutableCopy ]; + + XCTAssertNotNil( items , @"Array should be valid" ); + XCTAssertTrue ( 7 == [ items count ], @"Array should have 7 items" ); - STAssertNotNil( items , @"Array should be valid" ); - STAssertTrue ( 7 == [ items count ], @"Array should have 7 items" ); - - [items shrinkToSize:3]; - STAssertNotNil( items , @"Array should be valid" ); - STAssertTrue ( 3 == [ items count ], @"Array should have 3 items" ); + [ items shrinkToSize: 3 ]; + XCTAssertNotNil( items , @"Array should be valid" ); + XCTAssertTrue ( 3 == [ items count ], @"Array should have 3 items" ); - STAssertTrue( [ [ items lastObject ] isEqualToString: @"three" ], @"Last item mismatch" ); + XCTAssertTrue( [ [ items lastObject ] isEqualToString: @"three" ], @"Last item mismatch" ); } { @@ -87,15 +87,15 @@ -(void)testArrayShrinksCorrectly , @"five" , @"six" , @"seven" ] mutableCopy ]; - - STAssertNotNil( items , @"Array should be valid" ); - STAssertTrue ( 7 == [ items count ], @"Array should have 7 items" ); + + XCTAssertNotNil( items , @"Array should be valid" ); + XCTAssertTrue ( 7 == [ items count ], @"Array should have 7 items" ); [ items shrinkToSize: 5 ]; - STAssertNotNil( items , @"Array should be valid" ); - STAssertTrue ( 5 == [ items count ], @"Array should have 5 items" ); + XCTAssertNotNil( items , @"Array should be valid" ); + XCTAssertTrue ( 5 == [ items count ], @"Array should have 5 items" ); - STAssertTrue( [ [ items lastObject ] isEqualToString: @"five" ], @"Last item mismatch" ); + XCTAssertTrue( [ [ items lastObject ] isEqualToString: @"five" ], @"Last item mismatch" ); } } diff --git a/lib/JFFUtils/JFFUtilsTest/MethodObserverTest.h b/lib/JFFUtils/JFFUtilsTest/MethodObserverTest.h index 95b6944..abe1243 100644 --- a/lib/JFFUtils/JFFUtilsTest/MethodObserverTest.h +++ b/lib/JFFUtils/JFFUtilsTest/MethodObserverTest.h @@ -1,5 +1,5 @@ -#import +#import -@interface MethodObserverTest : SenTestCase +@interface MethodObserverTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/MethodObserverTest.m b/lib/JFFUtils/JFFUtilsTest/MethodObserverTest.m index 6f76650..c9b2d5c 100644 --- a/lib/JFFUtils/JFFUtilsTest/MethodObserverTest.m +++ b/lib/JFFUtils/JFFUtilsTest/MethodObserverTest.m @@ -49,12 +49,15 @@ - (NSString *)returnObjectForArg1:(NSRange)arg1 arg3:(float)arg3 arg4:(double)arg4 { - return [[NSString alloc] initWithFormat:@"arg1: %@ arg2: %@ arg3: %f arg4: %f", + NSString* result = + [[NSString alloc] initWithFormat:@"arg1: %@ arg2: {%.1f, %.1f} arg3: %1f arg4: %1f", NSStringFromRange(arg1), - NSStringFromCGPoint(arg2), + arg2.x, arg2.y, arg3, arg4 ]; + + return result; } - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event @@ -316,8 +319,8 @@ - (void)testPointInsideWithEventMethod return ^BOOL(id _self, CGPoint point, UIEvent *event) { - STAssertEqualObjects(NSStringFromCGPoint(originalPoint), NSStringFromCGPoint(point), nil); - STAssertTrue(originalEvent == event, nil); + XCTAssertEqualObjects(NSStringFromCGPoint(originalPoint), NSStringFromCGPoint(point), @"points mismatch"); + XCTAssertTrue(originalEvent == event, @"pointer mismatch" ); hookWasCalled = YES; @@ -325,10 +328,10 @@ - (void)testPointInsideWithEventMethod BOOL previousResult = previousImplementation(_self, point, event); - STAssertEqualObjects(NSStringFromCGPoint(originalPoint), NSStringFromCGPoint(weakTestObject.point), nil); - STAssertTrue(originalEvent == weakTestObject.event, nil); + XCTAssertEqualObjects(NSStringFromCGPoint(originalPoint), NSStringFromCGPoint(weakTestObject.point), @"points mismatch"); + XCTAssertTrue(originalEvent == weakTestObject.event, @"pointer mismatch"); - STAssertTrue(previousResult, nil); + XCTAssertTrue(previousResult, @"previousResult mismatch"); return NO; }; @@ -342,9 +345,9 @@ - (void)testPointInsideWithEventMethod BOOL result = [testObject pointInside:originalPoint withEvent:originalEvent]; - STAssertFalse(result, nil); + XCTAssertFalse(result, @"point must be outside" ); - STAssertTrue(hookWasCalled, nil); + XCTAssertTrue(hookWasCalled, @"hook call missed" ); } //test normal call @@ -356,9 +359,9 @@ - (void)testPointInsideWithEventMethod BOOL result = [testObject pointInside:originalPoint withEvent:originalEvent]; - STAssertTrue(result, nil); + XCTAssertTrue(result, @"point inside musmatch"); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory management issue"); } } @@ -380,8 +383,8 @@ - (void)testVoidReturnTypeCall previousImplementation(_self, arg, str); - STAssertEquals((NSUInteger)24, *arg, nil); - STAssertEqualObjects(@"32", str, nil); + XCTAssertEqual((NSUInteger)24, *arg, @"unexpected arg"); + XCTAssertEqualObjects(@"32", str, @"unexpected arg"); *arg = 11; }; @@ -398,9 +401,9 @@ - (void)testVoidReturnTypeCall [testObject mutStateOnArgPtr:&originalArg str:@"32"]; - STAssertEquals((NSUInteger)11, originalArg, nil); + XCTAssertEqual((NSUInteger)11, originalArg, @"unexpected arg"); - STAssertTrue(hookWasCalled, nil); + XCTAssertTrue(hookWasCalled, @"hook call missed"); } //test normal call @@ -418,9 +421,9 @@ - (void)testVoidReturnTypeCall id result = [testObject returnObjectForIntegerPoint:NSMakeRange(2, 3) arg:originalArg]; - STAssertEqualObjects(@(originalArg * originalState), result, nil); + XCTAssertEqualObjects(@(originalArg * originalState), result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory leak"); } } @@ -445,9 +448,9 @@ - (void)testSimpleExample NSUInteger previousResult = previousImplementation(_self, arg); - STAssertEquals((NSUInteger)24, previousResult, nil); + XCTAssertEqual((NSUInteger)24, previousResult, @"unexpected arg"); - STAssertEquals((NSUInteger)12, arg, nil); + XCTAssertEqual((NSUInteger)12, arg, @"unexpected arg"); return 11; }; }; @@ -461,9 +464,9 @@ - (void)testSimpleExample NSUInteger result = [testObject mutStateOnArg:originalArg]; - STAssertEquals((NSUInteger)11, result, nil); + XCTAssertEqual((NSUInteger)11, result, @"unexpected arg"); - STAssertTrue(hookWasCalled, nil); + XCTAssertTrue(hookWasCalled, @"hook call missed"); } //test normal call @@ -481,15 +484,15 @@ - (void)testSimpleExample NSUInteger result = [testObject mutStateOnArg:originalArg]; - STAssertEquals((NSUInteger)30, result, nil); + XCTAssertEqual((NSUInteger)30, result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory leak"); } } - (void)testSignatures { - id block = ^NSObject *(id _self, NSUInteger arg, NSRange point) { + id block = ^id(id _self, NSUInteger arg, NSRange point) { return nil; }; @@ -500,13 +503,13 @@ - (void)testSignatures NSMethodSignature *methodSig = [NSMethodSignature signatureWithObjCTypes:methodSinature]; NSMethodSignature *blockSig = [NSMethodSignature signatureWithObjCTypes:blockSinature ]; - STAssertTrue(strcmp(methodSig.methodReturnType, blockSig.methodReturnType) == 0, nil); - STAssertTrue(methodSig.numberOfArguments == blockSig.numberOfArguments, nil); - STAssertTrue(methodSig.frameLength == blockSig.frameLength, nil); + XCTAssertTrue(strcmp(methodSig.methodReturnType, blockSig.methodReturnType) == 0, @"methodReturnType mismatch"); + XCTAssertTrue(methodSig.numberOfArguments == blockSig.numberOfArguments, @"numberOfArguments mismatch"); + XCTAssertTrue(methodSig.frameLength == blockSig.frameLength, @"frameLength mismatch"); for (NSUInteger index = 2; index < methodSig.numberOfArguments; ++index) { - STAssertTrue(strcmp([methodSig getArgumentTypeAtIndex:index], [blockSig getArgumentTypeAtIndex:index]) == 0, @"parameter mismatch"); + XCTAssertTrue(strcmp([methodSig getArgumentTypeAtIndex:index], [blockSig getArgumentTypeAtIndex:index]) == 0, @"parameter mismatch"); } } @@ -517,11 +520,11 @@ - (void)testDynamicBlockInvocation_DynamicArgumentsOrder NSObject *(^block)(id _self, NSRange point, NSRange point2) = ^NSObject *(id _self, NSRange point, NSRange point2) { - STAssertEquals(originalRange1.length, point.length, nil); - STAssertEquals(originalRange1.location, point.location, nil); + XCTAssertEqual(originalRange1.length, point.length, @"length mismatch"); + XCTAssertEqual(originalRange1.location, point.location, @"location mismatch"); - STAssertEquals(originalRange2.length, point2.length, nil); - STAssertEquals(originalRange2.location, point2.location, nil); + XCTAssertEqual(originalRange2.length, point2.length, @"length mismatch"); + XCTAssertEqual(originalRange2.location, point2.location, @"location mismatch"); //return (__bridge NSObject *)(CFRetain((__bridge_retained CFTypeRef)@3)); return @"12"; @@ -559,7 +562,7 @@ - (void)testDynamicBlockInvocation_DynamicArgumentsOrder id result = [obj returnObjectForIntegerPoint:originalRange1 point:originalRange2]; - STAssertEqualObjects(@"12", result, nil); + XCTAssertEqualObjects(@"12", result, @"unexpected arg"); } //- (NSObject *)returnObjectForIntegerPoint:(NSRange)point @@ -590,7 +593,7 @@ - (void)testHookExistedMethodWithLotOfArgs { id previousResult = previousBlock(_self, arg1, arg2, arg3, arg4); - STAssertEqualObjects(@"arg1: {7, 8} arg2: {4.5, 6.7} arg3: 3.200000 arg4: 2.300000", previousResult, nil); + XCTAssertEqualObjects(@"arg1: {7, 8} arg2: {4.5, 6.7} arg3: 3.200000 arg4: 2.300000", previousResult, @"unexpected format"); } return @"1"; @@ -613,11 +616,11 @@ - (void)testHookExistedMethodWithLotOfArgs arg3:3.2 arg4:2.3]; - STAssertEqualObjects(@"1", result, nil); + XCTAssertEqualObjects(@"1", result, @"bad result"); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); } - (void)testHookExistedMethodWithObjectPointerReturnType @@ -642,10 +645,10 @@ - (void)testHookExistedMethodWithObjectPointerReturnType { id previousResult = previousBlock(_self, point, arg); - STAssertEqualObjects(@(originalArg * originalState), previousResult, nil); + XCTAssertEqualObjects(@(originalArg * originalState), previousResult, @"unexpected arg"); } - STAssertEquals(originalArg, arg, nil); + XCTAssertEqual(originalArg, arg, @"unexpected arg"); return @(originalArg); }; }; @@ -663,11 +666,11 @@ - (void)testHookExistedMethodWithObjectPointerReturnType id result = [testObject returnObjectForIntegerPoint:NSMakeRange(2, 3) arg:originalArg]; - STAssertEqualObjects(@(originalArg), result, nil); + XCTAssertEqualObjects(@(originalArg), result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); } //test normal call { @@ -684,9 +687,9 @@ - (void)testHookExistedMethodWithObjectPointerReturnType id result = [testObject returnObjectForIntegerPoint:NSMakeRange(2, 3) arg:originalArg]; - STAssertEqualObjects(@(originalArg * originalState), result, nil); + XCTAssertEqualObjects(@(originalArg * originalState), result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory leak"); } } @@ -708,9 +711,9 @@ - (void)testHookNotExistedMethodWithObjectPointerReturnType BlockObserver previousBlock = previousBlockGetter(); - STAssertNil(previousBlock, @"no original method"); + XCTAssertNil(previousBlock, @"no original method"); - STAssertEquals(originalArg, arg, nil); + XCTAssertEqual(originalArg, arg, @"arg mismatch"); return [@(originalArg) stringValue]; }; }; @@ -726,11 +729,11 @@ - (void)testHookNotExistedMethodWithObjectPointerReturnType id result = [testObject returnObjectForIntegerPoint2:NSMakeRange(2, 3) arg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg" ); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); } //test normal call @@ -747,16 +750,16 @@ - (void)testHookNotExistedMethodWithObjectPointerReturnType testObject.state = originalState; //todo fix? - STAssertTrue([testObject respondsToSelector:@selector(returnObjectForIntegerPoint2:arg:)], nil); + XCTAssertTrue([testObject respondsToSelector:@selector(returnObjectForIntegerPoint2:arg:)], @"method missing"); - STAssertThrows({ + XCTAssertThrows({ [testObject returnObjectForIntegerPoint2:NSMakeRange(2, 3) arg:originalArg]; - }, nil); + }, @"method missing"); - //STAssertEqualObjects([@(originalArg * originalState) stringValue], result, nil); + //XCTAssertEqualObjects([@(originalArg * originalState) stringValue], result, nil); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory leak"); } } @@ -779,9 +782,9 @@ - (void)testCase1_a BlockObserver previousBlock = previousBlockGetter(); - STAssertNil(previousBlock, @"no original method"); + XCTAssertNil(previousBlock, @"no original method"); - STAssertEquals(originalArg, arg, nil); + XCTAssertEqual(originalArg, arg, @"arg mismatch"); return [@(originalArg) stringValue]; }; }; @@ -797,11 +800,11 @@ - (void)testCase1_a id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); } //test normal call for child @@ -815,14 +818,14 @@ - (void)testCase1_a weakTestObject = testObject; //todo fix? - STAssertTrue([testObject respondsToSelector:@selector(returnObjectForArg:)], nil); + XCTAssertTrue([testObject respondsToSelector:@selector(returnObjectForArg:)], @"method missing"); - STAssertThrows({ + XCTAssertThrows({ [testObject returnObjectForArg:originalArg]; - }, nil); + }, @"unexpected arg"); - //STAssertEqualObjects([@(originalArg * originalState) stringValue], result, nil); + //XCTAssertEqualObjects([@(originalArg * originalState) stringValue], result, nil); } } @@ -836,14 +839,14 @@ - (void)testCase1_a ParentTestClassCase1_a *testObject = [ParentTestClassCase1_a new]; weakTestObject = testObject; - STAssertFalse([testObject respondsToSelector:@selector(returnObjectForArg:)], nil); + XCTAssertFalse([testObject respondsToSelector:@selector(returnObjectForArg:)], @"method missing"); - STAssertThrows({ + XCTAssertThrows({ [testObject returnObjectForArg:originalArg]; - }, nil); + }, @"unexpected arg"); - //STAssertEqualObjects([@(originalArg * originalState) stringValue], result, nil); + //XCTAssertEqualObjects([@(originalArg * originalState) stringValue], result, nil); } } } @@ -868,9 +871,9 @@ - (void)testCase1_b BlockObserver previousBlock = previousBlockGetter(); - STAssertNil(previousBlock, @"no original method"); + XCTAssertNil(previousBlock, @"no original method"); - STAssertEquals(originalArg, arg, nil); + XCTAssertEqual(originalArg, arg, @"arg mismatch"); return [@(originalArg) stringValue]; }; }; @@ -886,11 +889,11 @@ - (void)testCase1_b id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); }; hookTest(); @@ -907,12 +910,12 @@ - (void)testCase1_b weakTestObject = testObject; //todo fix? - STAssertTrue([testObject respondsToSelector:@selector(returnObjectForArg:)], nil); + XCTAssertTrue([testObject respondsToSelector:@selector(returnObjectForArg:)], @"missing method"); - STAssertThrows({ + XCTAssertThrows({ [testObject returnObjectForArg:originalArg]; - }, nil); + }, @"assert expected"); } } @@ -927,12 +930,12 @@ - (void)testCase1_b weakTestObject = testObject; //todo fix? - STAssertTrue([testObject respondsToSelector:@selector(returnObjectForArg:)], nil); + XCTAssertTrue([testObject respondsToSelector:@selector(returnObjectForArg:)], @"missing method"); - STAssertThrows({ + XCTAssertThrows({ [testObject returnObjectForArg:originalArg]; - }, nil); + }, @"assert expected"); } } } @@ -961,10 +964,10 @@ - (void)testCase2_a { id previousResult = previousBlock(_self, arg); - STAssertEqualObjects([@(originalArg) stringValue], previousResult, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], previousResult, @"arg mismatch"); } - STAssertEquals(originalArg, arg, nil); + XCTAssertEqual(originalArg, arg, @"arg mismatch"); return [@(internalResult) stringValue]; }; }; @@ -980,11 +983,11 @@ - (void)testCase2_a id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(internalResult) stringValue], result, nil); + XCTAssertEqualObjects([@(internalResult) stringValue], result, @"arg mismatch"); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); }; firstHookTest(); @@ -1000,9 +1003,9 @@ - (void)testCase2_a id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory leak"); } //test normal call { @@ -1014,12 +1017,12 @@ - (void)testCase2_a ParentTestClassCase2_a *testObject = [ParentTestClassCase2_a new]; weakTestObject = testObject; - STAssertThrows({ + XCTAssertThrows({ [testObject returnObjectForArg:originalArg]; - }, nil); + }, @"assert expected"); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory leak"); } //hook parent @@ -1037,9 +1040,9 @@ - (void)testCase2_a hookWasCalled = YES; BlockObserver previousBlock = previousBlockGetter(); - STAssertNil(previousBlock, nil); + XCTAssertNil(previousBlock, @"previous block missing"); - STAssertEquals(originalArg, arg, nil); + XCTAssertEqual(originalArg, arg, @"arg mismatch"); return [@(arg) stringValue]; }; }; @@ -1055,11 +1058,11 @@ - (void)testCase2_a id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); } firstHookTest(); @@ -1085,9 +1088,9 @@ - (void)testCase2_b hookWasCalled = YES; BlockObserver previousBlock = previousBlockGetter(); - STAssertNil(previousBlock, nil); + XCTAssertNil(previousBlock, @"previous block missing"); - STAssertEquals(originalArg, arg, nil); + XCTAssertEqual(originalArg, arg, @"arg mismatch"); return [@(internalResult) stringValue]; }; }; @@ -1103,11 +1106,11 @@ - (void)testCase2_b id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(internalResult) stringValue], result, nil); + XCTAssertEqualObjects([@(internalResult) stringValue], result, @"arg mismatch"); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); }; firstHookTest(); @@ -1123,9 +1126,9 @@ - (void)testCase2_b id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory leak"); } //test normal call { @@ -1137,12 +1140,12 @@ - (void)testCase2_b ParentTestClassCase2_a *testObject = [ParentTestClassCase2_a new]; weakTestObject = testObject; - STAssertThrows({ + XCTAssertThrows({ [testObject returnObjectForArg:originalArg]; - }, nil); + }, @"assert expected"); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory leak"); } //hook child @@ -1164,10 +1167,10 @@ - (void)testCase2_b { id previousResult = previousBlock(_self, arg); - STAssertEqualObjects([@(originalArg) stringValue], previousResult, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], previousResult, @"arg mismatch"); } - STAssertEquals(originalArg, arg, nil); + XCTAssertEqual(originalArg, arg, @"arg mismatch"); return [@(arg) stringValue]; }; }; @@ -1183,11 +1186,11 @@ - (void)testCase2_b id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); } firstHookTest(); @@ -1217,10 +1220,10 @@ - (void)testCase3_a { id previousResult = previousBlock(_self, arg); - STAssertEqualObjects([@(originalArg) stringValue], previousResult, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], previousResult, @"arg mismatch"); } - STAssertEquals(originalArg, arg, nil); + XCTAssertEqual(originalArg, arg, @"arg mismatch"); return [@(internalResult) stringValue]; }; }; @@ -1236,11 +1239,11 @@ - (void)testCase3_a id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(internalResult) stringValue], result, nil); + XCTAssertEqualObjects([@(internalResult) stringValue], result, @"arg mismatch"); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); }; firstHookTest(); @@ -1256,9 +1259,9 @@ - (void)testCase3_a id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory leak"); } //test normal call { @@ -1272,9 +1275,9 @@ - (void)testCase3_a id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory leak"); } //hook parent @@ -1296,10 +1299,10 @@ - (void)testCase3_a { id previousResult = previousBlock(_self, arg); - STAssertEqualObjects([@(originalArg) stringValue], previousResult, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], previousResult, @"arg mismatch"); } - STAssertEquals(originalArg, arg, nil); + XCTAssertEqual(originalArg, arg, @"arg mismatch"); return [@(arg) stringValue]; }; }; @@ -1315,11 +1318,11 @@ - (void)testCase3_a id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); } firstHookTest(); @@ -1349,10 +1352,10 @@ - (void)testCase3_b { id previousResult = previousBlock(_self, arg); - STAssertEqualObjects([@(originalArg) stringValue], previousResult, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], previousResult, @"arg mismatch"); } - STAssertEquals(originalArg, arg, nil); + XCTAssertEqual(originalArg, arg, @"arg mismatch"); return [@(internalResult) stringValue]; }; }; @@ -1368,11 +1371,11 @@ - (void)testCase3_b id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(internalResult) stringValue], result, nil); + XCTAssertEqualObjects([@(internalResult) stringValue], result, @"arg mismatch"); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); }; firstHookTest(); @@ -1388,9 +1391,9 @@ - (void)testCase3_b id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory leak"); } //test normal call { @@ -1404,9 +1407,9 @@ - (void)testCase3_b id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory leak"); } //hook parent @@ -1428,10 +1431,10 @@ - (void)testCase3_b { id previousResult = previousBlock(_self, arg); - STAssertEqualObjects([@(originalArg) stringValue], previousResult, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], previousResult, @"arg mismatch"); } - STAssertEquals(originalArg, arg, nil); + XCTAssertEqual(originalArg, arg, @"arg mismatch"); return [@(arg) stringValue]; }; }; @@ -1447,11 +1450,11 @@ - (void)testCase3_b id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); } firstHookTest(); @@ -1481,10 +1484,10 @@ - (void)testCase4_a { id previousResult = previousBlock(_self, arg); - STAssertEqualObjects([@(originalArg * 2) stringValue], previousResult, nil); + XCTAssertEqualObjects([@(originalArg * 2) stringValue], previousResult, @"arg mismatch"); } - STAssertEquals(originalArg, arg, nil); + XCTAssertEqual(originalArg, arg, @"arg mismatch"); return [@(internalResult) stringValue]; }; }; @@ -1500,11 +1503,11 @@ - (void)testCase4_a id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(internalResult) stringValue], result, nil); + XCTAssertEqualObjects([@(internalResult) stringValue], result, @"arg mismatch"); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); }; firstHookTest(); @@ -1520,9 +1523,9 @@ - (void)testCase4_a id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg * 2) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg * 2) stringValue], result, @"arg mismatch"); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory leak"); } //test normal call { @@ -1536,9 +1539,9 @@ - (void)testCase4_a id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory leak"); } //hook child @@ -1560,10 +1563,10 @@ - (void)testCase4_a { id previousResult = previousBlock(_self, arg); - STAssertEqualObjects([@(originalArg) stringValue], previousResult, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], previousResult, @"arg mismatch"); } - STAssertEquals(originalArg, arg, nil); + XCTAssertEqual(originalArg, arg, @"arg mismatch"); return [@(arg) stringValue]; }; }; @@ -1579,11 +1582,11 @@ - (void)testCase4_a id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); } firstHookTest(); @@ -1613,10 +1616,10 @@ - (void)testCase4_b { id previousResult = previousBlock(_self, arg); - STAssertEqualObjects([@(originalArg) stringValue], previousResult, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], previousResult, @"arg mismatch"); } - STAssertEquals(originalArg, arg, nil); + XCTAssertEqual(originalArg, arg, @"arg mismatch"); return [@(internalResult) stringValue]; }; }; @@ -1632,11 +1635,11 @@ - (void)testCase4_b id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(internalResult) stringValue], result, nil); + XCTAssertEqualObjects([@(internalResult) stringValue], result, @"arg mismatch"); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); }; firstHookTest(); @@ -1652,9 +1655,9 @@ - (void)testCase4_b id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg * 2) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg * 2) stringValue], result, @"arg mismatch"); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory leak"); } //test normal call { @@ -1668,9 +1671,9 @@ - (void)testCase4_b id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); + XCTAssertNil(weakTestObject, @"memory leak"); } //hook child @@ -1692,10 +1695,10 @@ - (void)testCase4_b { id previousResult = previousBlock(_self, arg); - STAssertEqualObjects([@(originalArg * 2) stringValue], previousResult, nil); + XCTAssertEqualObjects([@(originalArg * 2) stringValue], previousResult, @"arg mismatch"); } - STAssertEquals(originalArg, arg, nil); + XCTAssertEqual(originalArg, arg, @"arg mismatch"); return [@(arg) stringValue]; }; }; @@ -1711,11 +1714,11 @@ - (void)testCase4_b id result = [testObject returnObjectForArg:originalArg]; - STAssertEqualObjects([@(originalArg) stringValue], result, nil); + XCTAssertEqualObjects([@(originalArg) stringValue], result, @"unexpected arg"); } - STAssertNil(weakTestObject, nil); - STAssertTrue(hookWasCalled, nil); + XCTAssertNil(weakTestObject, @"memory leak"); + XCTAssertTrue(hookWasCalled, @"hook call missed"); } firstHookTest(); diff --git a/lib/JFFUtils/JFFUtilsTest/NSArray+ExpandArrayTest.h b/lib/JFFUtils/JFFUtilsTest/NSArray+ExpandArrayTest.h index 40c2c74..8f0f540 100644 --- a/lib/JFFUtils/JFFUtilsTest/NSArray+ExpandArrayTest.h +++ b/lib/JFFUtils/JFFUtilsTest/NSArray+ExpandArrayTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface NSArray_ExpandArrayTest : SenTestCase +@interface NSArray_ExpandArrayTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/NSArray+ExpandArrayTest.m b/lib/JFFUtils/JFFUtilsTest/NSArray+ExpandArrayTest.m index 47fba0e..28585ab 100644 --- a/lib/JFFUtils/JFFUtilsTest/NSArray+ExpandArrayTest.m +++ b/lib/JFFUtils/JFFUtilsTest/NSArray+ExpandArrayTest.m @@ -23,7 +23,7 @@ - (void)testExpandArray ]; NSArray *result = [array expandArray]; - STAssertEqualObjects(expectedResult, result, nil); + XCTAssertEqualObjects(expectedResult, result); } @end diff --git a/lib/JFFUtils/JFFUtilsTest/NSDictionary+BlocksAdditionsTest.h b/lib/JFFUtils/JFFUtilsTest/NSDictionary+BlocksAdditionsTest.h index a6a24a8..2c65853 100644 --- a/lib/JFFUtils/JFFUtilsTest/NSDictionary+BlocksAdditionsTest.h +++ b/lib/JFFUtils/JFFUtilsTest/NSDictionary+BlocksAdditionsTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface NSDictionary_BlocksAdditionsTest : SenTestCase +@interface NSDictionary_BlocksAdditionsTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/NSDictionary+BlocksAdditionsTest.m b/lib/JFFUtils/JFFUtilsTest/NSDictionary+BlocksAdditionsTest.m index c6ff298..232d26b 100644 --- a/lib/JFFUtils/JFFUtilsTest/NSDictionary+BlocksAdditionsTest.m +++ b/lib/JFFUtils/JFFUtilsTest/NSDictionary+BlocksAdditionsTest.m @@ -15,23 +15,23 @@ - (void)testMapMethod return @(num * [key integerValue]); }]; - STAssertTrue([result count] == 3, nil); + XCTAssertTrue([result count] == 3); if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 6.) - STAssertFalse([result isKindOfClass:[NSMutableDictionary class]], nil); - STAssertTrue ([result isKindOfClass:[NSDictionary class]], nil); + XCTAssertFalse([result isKindOfClass:[NSMutableDictionary class]]); + XCTAssertTrue ([result isKindOfClass:[NSDictionary class]]); - STAssertEqualObjects(@1, result[@"1"], nil); - STAssertEqualObjects(@4, result[@"2"], nil); - STAssertEqualObjects(@9, result[@"3"], nil); + XCTAssertEqualObjects(@1, result[@"1"]); + XCTAssertEqualObjects(@4, result[@"2"]); + XCTAssertEqualObjects(@9, result[@"3"]); - STAssertThrows({ + XCTAssertThrows({ [dict map:^id(id key, id object) { NSUInteger num = [object unsignedIntegerValue]; if (num == 3) return nil; return @(num * 2); }]; - }, nil); + }); } - (void)testEachMethod @@ -50,16 +50,16 @@ - (void)testEachMethod [objects addObject:object]; }]; - STAssertTrue([keys count] == 3, nil); + XCTAssertTrue([keys count] == 3); for (id key in [dict allKeys]) { - STAssertTrue([keys containsObject:key], nil); + XCTAssertTrue([keys containsObject:key]); } - STAssertTrue([objects count] == 3, nil); + XCTAssertTrue([objects count] == 3); for (id value in [dict allValues]) { - STAssertTrue([objects containsObject:value], nil); + XCTAssertTrue([objects containsObject:value]); } } @@ -75,7 +75,7 @@ - (void)testCountMethod return [@2 isEqualToNumber:object] && [@"2" isEqualToString:key]; }]; - STAssertTrue(count == 1, nil); + XCTAssertTrue(count == 1); } - (void)testKeyMethod @@ -90,23 +90,23 @@ - (void)testKeyMethod return [[key uppercaseString] stringByAppendingFormat:@"%@", object]; }]; - STAssertTrue([result count] == 3, nil); + XCTAssertTrue([result count] == 3); if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 6.) - STAssertFalse([result isKindOfClass:[NSMutableDictionary class]], nil); - STAssertTrue([result isKindOfClass:[NSDictionary class]], nil); + XCTAssertFalse([result isKindOfClass:[NSMutableDictionary class]]); + XCTAssertTrue([result isKindOfClass:[NSDictionary class]]); - STAssertEqualObjects(@1, result[@"ONE1" ], nil); - STAssertEqualObjects(@2, result[@"TWO2" ], nil); - STAssertEqualObjects(@3, result[@"THREE3"], nil); + XCTAssertEqualObjects(@1, result[@"ONE1" ]); + XCTAssertEqualObjects(@2, result[@"TWO2" ]); + XCTAssertEqualObjects(@3, result[@"THREE3"]); - STAssertThrows({ + XCTAssertThrows({ [dict map:^id(id key, id object) { NSUInteger num = [object unsignedIntegerValue]; if (num == 3) return nil; return [key uppercaseString]; }]; - }, nil); + }); } - (void)testMapAndErrorMethodWithoutError @@ -120,21 +120,21 @@ - (void)testMapAndErrorMethodWithoutError NSError *error; NSDictionary *result = [dict map:^id(id key, id object, NSError **outError) { - STAssertTrue(outError != NULL, nil); + XCTAssertTrue(outError != NULL); NSUInteger num = [object unsignedIntegerValue]; return @(num * [key integerValue]); } error:&error]; - STAssertNil(error, nil); + XCTAssertNil(error); - STAssertTrue([result count] == 3, nil); + XCTAssertTrue([result count] == 3); if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 6.) - STAssertFalse([result isKindOfClass:[NSMutableDictionary class]], nil); - STAssertTrue([result isKindOfClass:[NSDictionary class]], nil); + XCTAssertFalse([result isKindOfClass:[NSMutableDictionary class]]); + XCTAssertTrue([result isKindOfClass:[NSDictionary class]]); - STAssertEqualObjects(@1, result[@"1"], nil); - STAssertEqualObjects(@4, result[@"2"], nil); - STAssertEqualObjects(@9, result[@"3"], nil); + XCTAssertEqualObjects(@1, result[@"1"]); + XCTAssertEqualObjects(@4, result[@"2"]); + XCTAssertEqualObjects(@9, result[@"3"]); } - (void)testMapAndErrorMethodWithError @@ -150,7 +150,7 @@ - (void)testMapAndErrorMethodWithError NSError *errorForMap = [JFFError newErrorWithDescription:@"test error"]; NSDictionary *result = [dict map:^id(id key, id object, NSError **outError) { - STAssertTrue(outError != NULL, nil); + XCTAssertTrue(outError != NULL); NSUInteger num = [object unsignedIntegerValue]; if (num == 3) { *outError = errorForMap; @@ -159,44 +159,44 @@ - (void)testMapAndErrorMethodWithError return @(num * [key integerValue]); } error:&error]; - STAssertNil(result, nil); - STAssertNotNil(error , nil); + XCTAssertNil(result); + XCTAssertNotNil(error ); - STAssertTrue(errorForMap == error, nil); + XCTAssertTrue(errorForMap == error); } - (void)testAny { NSArray *arr = @[@"a", @"b", @"c"]; - STAssertTrue([arr any:^BOOL(NSString *str) { + XCTAssertTrue([arr any:^BOOL(NSString *str) { return [str isEqualToString:@"a"]; - }], nil); + }]); - STAssertTrue([arr any:^BOOL(NSString *str) { + XCTAssertTrue([arr any:^BOOL(NSString *str) { return [str isEqualToString:@"b"]; - }], nil); + }]); - STAssertTrue([arr any:^BOOL(NSString *str) { + XCTAssertTrue([arr any:^BOOL(NSString *str) { return [str isEqualToString:@"c"]; - }], nil); + }]); - STAssertFalse([arr any:^BOOL(NSString *str) { + XCTAssertFalse([arr any:^BOOL(NSString *str) { return [str isEqualToString:@"d"]; - }], nil); + }]); } - (void)testAll { NSArray *arr = @[@"a", @"b", @"c"]; - STAssertTrue([arr all:^BOOL(NSString *str) { + XCTAssertTrue([arr all:^BOOL(NSString *str) { return [str length] == 1; - }], nil); + }]); - STAssertFalse([arr all:^BOOL(NSString *str) { + XCTAssertFalse([arr all:^BOOL(NSString *str) { return [str isEqualToString:@"a"] || [str isEqualToString:@"b"]; - }], nil); + }]); } @end diff --git a/lib/JFFUtils/JFFUtilsTest/NSObject+OwnershipsTest.h b/lib/JFFUtils/JFFUtilsTest/NSObject+OwnershipsTest.h index acbcca3..24212b9 100644 --- a/lib/JFFUtils/JFFUtilsTest/NSObject+OwnershipsTest.h +++ b/lib/JFFUtils/JFFUtilsTest/NSObject+OwnershipsTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface NSObjectOwnershipsExtensionTest : SenTestCase +@interface NSObjectOwnershipsExtensionTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/NSObject+OwnershipsTest.m b/lib/JFFUtils/JFFUtilsTest/NSObject+OwnershipsTest.m index d2db009..47f4aa6 100644 --- a/lib/JFFUtils/JFFUtilsTest/NSObject+OwnershipsTest.m +++ b/lib/JFFUtils/JFFUtilsTest/NSObject+OwnershipsTest.m @@ -16,9 +16,9 @@ - (void)testObjectOwnershipsExtension [owner addOwnedObject:owned]; } - STAssertNotNil(ownedDeallocated, @"Owned should not be dealloced"); + XCTAssertNotNil(ownedDeallocated, @"Owned should not be dealloced"); } - STAssertNil(ownedDeallocated, @"Owned should be dealloced"); + XCTAssertNil(ownedDeallocated, @"Owned should be dealloced"); } @end diff --git a/lib/JFFUtils/JFFUtilsTest/NSObjectInstancesCountTest.h b/lib/JFFUtils/JFFUtilsTest/NSObjectInstancesCountTest.h index c526102..7e14db4 100644 --- a/lib/JFFUtils/JFFUtilsTest/NSObjectInstancesCountTest.h +++ b/lib/JFFUtils/JFFUtilsTest/NSObjectInstancesCountTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface NSObjectInstancesCountTest : SenTestCase +@interface NSObjectInstancesCountTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/NSObjectInstancesCountTest.m b/lib/JFFUtils/JFFUtilsTest/NSObjectInstancesCountTest.m index 6fea422..b4caf2c 100644 --- a/lib/JFFUtils/JFFUtilsTest/NSObjectInstancesCountTest.m +++ b/lib/JFFUtils/JFFUtilsTest/NSObjectInstancesCountTest.m @@ -25,9 +25,9 @@ - (void)testObjectInstancesCount NSUInteger initialInsancesCount = [TestClassA instancesCount]; @autoreleasepool { TestClassA *a = [TestClassA new]; - STAssertTrue(1 == [TestClassA instancesCount] && a, @"We have instances of TestClassA"); + XCTAssertTrue(1 == [TestClassA instancesCount] && a, @"We have instances of TestClassA"); } - STAssertTrue(initialInsancesCount == [TestClassA instancesCount], @"We have no instances of TestClassA" ); + XCTAssertTrue(initialInsancesCount == [TestClassA instancesCount], @"We have no instances of TestClassA" ); } - (void)testObjectInstancesCountWithInheritance @@ -36,20 +36,20 @@ - (void)testObjectInstancesCountWithInheritance NSUInteger initialInsancesCountB = [TestClassB instancesCount]; @autoreleasepool { id b = [TestClassB new]; - STAssertTrue(1 == [TestClassB instancesCount] && b, @"We have instances of TestClassB class"); + XCTAssertTrue(1 == [TestClassB instancesCount] && b, @"We have instances of TestClassB class"); @autoreleasepool { id a = [TestClassA new]; - STAssertTrue(1 == [TestClassA instancesCount], @"We have instances of TestClassA class"); - STAssertTrue(1 == [TestClassB instancesCount] && a, @"We have instances of TestClassB class"); + XCTAssertTrue(1 == [TestClassA instancesCount], @"We have instances of TestClassA class"); + XCTAssertTrue(1 == [TestClassB instancesCount] && a, @"We have instances of TestClassB class"); } - STAssertTrue(0 == [TestClassA instancesCount], @"We have no instances of TestClassA class"); - STAssertTrue(1 == [TestClassB instancesCount], @"We have instances of TestClassB class"); + XCTAssertTrue(0 == [TestClassA instancesCount], @"We have no instances of TestClassA class"); + XCTAssertTrue(1 == [TestClassB instancesCount], @"We have instances of TestClassB class"); } - STAssertTrue(initialInsancesCountA == [TestClassA instancesCount], @"We have no instances of TestClassA class"); - STAssertTrue(initialInsancesCountB == [TestClassB instancesCount], @"We have no instances of TestClassB class"); + XCTAssertTrue(initialInsancesCountA == [TestClassA instancesCount], @"We have no instances of TestClassA class"); + XCTAssertTrue(initialInsancesCountB == [TestClassB instancesCount], @"We have no instances of TestClassB class"); } @end diff --git a/lib/JFFUtils/JFFUtilsTest/NSObjectRuntimeExtensionsTest.h b/lib/JFFUtils/JFFUtilsTest/NSObjectRuntimeExtensionsTest.h index 6cbe8a2..229bcda 100644 --- a/lib/JFFUtils/JFFUtilsTest/NSObjectRuntimeExtensionsTest.h +++ b/lib/JFFUtils/JFFUtilsTest/NSObjectRuntimeExtensionsTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface NSObjectRuntimeExtensionsTest : SenTestCase +@interface NSObjectRuntimeExtensionsTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/NSObjectRuntimeExtensionsTest.m b/lib/JFFUtils/JFFUtilsTest/NSObjectRuntimeExtensionsTest.m index 65e9b2d..5f31821 100644 --- a/lib/JFFUtils/JFFUtilsTest/NSObjectRuntimeExtensionsTest.m +++ b/lib/JFFUtils/JFFUtilsTest/NSObjectRuntimeExtensionsTest.m @@ -5,6 +5,9 @@ static const NSUInteger testClassMethodResult = 34;//just rendomize number static const NSUInteger testInstanceMethodResult = 35;//just rendomize number +typedef NSUInteger (*UIntPropertyGetterMsgSendFunction)(id, SEL); +static const UIntPropertyGetterMsgSendFunction FPropertyGetter = (UIntPropertyGetterMsgSendFunction)objc_msgSend; + @interface NSTestClass : NSObject @end @@ -121,14 +124,14 @@ @implementation NSObjectRuntimeExtensionsTest - (void)testHookInstanceMethodAssertPrototypeAndTargetSelectors { - STAssertThrows({ + XCTAssertThrows({ [[HookMethodsClass class] hookInstanceMethodForClass:[NSTestClass class] withSelector:@selector(instanceMethodWithLongNameForUniquenessPurposes) prototypeMethodSelector:@selector(instanceMethodWithLongNameForUniquenessPurposes) hookMethodSelector:@selector(hookMethod)]; }, @"no prototypeMethodSelector asert expected" ); - STAssertThrows({ + XCTAssertThrows({ [[HookMethodsClass class] hookInstanceMethodForClass:[NSTestClass class] withSelector:@selector(instanceMethodWithLongNameForUniquenessPurposes2) prototypeMethodSelector:@selector(prototypeMethod) @@ -145,7 +148,7 @@ - (void)testHookInstanceMethod NSTestClass *instance_ = [NSTestClass new]; - STAssertEquals(testInstanceMethodResult, + XCTAssertEqual(testInstanceMethodResult, [instance_ instanceMethodWithLongNameForUniquenessPurposes], @"result mismatch"); @@ -154,21 +157,21 @@ - (void)testHookInstanceMethod prototypeMethodSelector:@selector(prototypeMethod) hookMethodSelector:@selector(hookMethod)]; - STAssertEquals( testInstanceMethodResult * 2 + XCTAssertEqual( testInstanceMethodResult * 2 , [ instance_ instanceMethodWithLongNameForUniquenessPurposes ] , @"result mismatch" ); } -(void)testHookClassMethodAssertPrototypeAndTargetSelectors { - STAssertThrows({ + XCTAssertThrows({ [[HookMethodsClass class] hookClassMethodForClass:[NSTestClass class] withSelector:@selector(classMethodWithLongNameForUniquenessPurposes) prototypeMethodSelector:@selector(classMethodWithLongNameForUniquenessPurposes) hookMethodSelector:@selector(hookMethod)]; }, @"no prototypeMethodSelector asert expected" ); - STAssertThrows({ + XCTAssertThrows({ [[HookMethodsClass class] hookClassMethodForClass:[NSTestClass class] withSelector:@selector(classMethodWithLongNameForUniquenessPurposes2) prototypeMethodSelector:@selector(prototypeMethod) @@ -185,7 +188,7 @@ - (void)testHookClassMethod Class class = [NSTestClass class]; - STAssertEquals(testClassMethodResult, + XCTAssertEqual(testClassMethodResult, [class classMethodWithLongNameForUniquenessPurposes], @"result mismatch" ); @@ -194,30 +197,30 @@ - (void)testHookClassMethod prototypeMethodSelector:@selector(prototypeMethod) hookMethodSelector:@selector(hookMethod)]; - STAssertEquals( testClassMethodResult * 3 + XCTAssertEqual( testClassMethodResult * 3 , [ class classMethodWithLongNameForUniquenessPurposes ] , @"result mismatch" ); } - (void)testHasClassMethodWithSelector { - STAssertTrue([NSObject hasClassMethodWithSelector:@selector(allocWithZone:)], @"NSOBject has allocWithZone: method"); - STAssertFalse([NSObject hasClassMethodWithSelector:@selector(allocWithZone2:)], @"NSOBject has no allocWithZone2: method"); + XCTAssertTrue([NSObject hasClassMethodWithSelector:@selector(allocWithZone:)], @"NSOBject has allocWithZone: method"); + XCTAssertFalse([NSObject hasClassMethodWithSelector:@selector(allocWithZone2:)], @"NSOBject has no allocWithZone2: method"); - STAssertTrue([NSTestClass hasClassMethodWithSelector:@selector(allocWithZone:)], + XCTAssertTrue([NSTestClass hasClassMethodWithSelector:@selector(allocWithZone:)], @"NSTestClass has allocWithZone: method" ); - STAssertFalse( [ NSTestClass hasClassMethodWithSelector: @selector( alloc ) ] + XCTAssertFalse( [ NSTestClass hasClassMethodWithSelector: @selector( alloc ) ] , @"NSTestClass has no alloc method" ); } - (void)testHasInstanceMethodWithSelector { - STAssertTrue([NSObject hasInstanceMethodWithSelector:@selector(isEqual:)], @"NSOBject has isEqual: method"); - STAssertFalse([NSObject hasInstanceMethodWithSelector:@selector(isEqual2:)], @"NSOBject has no isEqual2: method"); + XCTAssertTrue([NSObject hasInstanceMethodWithSelector:@selector(isEqual:)], @"NSOBject has isEqual: method"); + XCTAssertFalse([NSObject hasInstanceMethodWithSelector:@selector(isEqual2:)], @"NSOBject has no isEqual2: method"); - STAssertTrue([NSTestClass hasInstanceMethodWithSelector:@selector(isEqual:)], + XCTAssertTrue([NSTestClass hasInstanceMethodWithSelector:@selector(isEqual:)], @"NSTestClass has isEqual: method"); - STAssertFalse([NSTestClass hasInstanceMethodWithSelector:@selector(description)], + XCTAssertFalse([NSTestClass hasInstanceMethodWithSelector:@selector(description)], @"NSTestClass has no description method" ); } @@ -231,13 +234,19 @@ - (void)testAddClassMethodIfNeedWithSelector toClass:[NSTestClass class] newMethodSelector:@selector(classMethodWithLongNameForUniquenessPurposes2)]; - STAssertTrue(result, @"method added"); + + XCTAssertTrue(result, @"method added"); + + + + XCTAssertTrue( [ NSTestClass hasClassMethodWithSelector: @selector( classMethodWithLongNameForUniquenessPurposes2 ) ] + , @"NSTestClass has classMethodWithLongNameForUniquenessPurposes2 method" ); + - STAssertTrue([NSTestClass hasClassMethodWithSelector:@selector(classMethodWithLongNameForUniquenessPurposes2)], - @"NSTestClass has classMethodWithLongNameForUniquenessPurposes2 method"); + NSUInteger method_result_ = FPropertyGetter( + [ NSTestClass class ], @selector( classMethodWithLongNameForUniquenessPurposes2 ) ); - NSUInteger methodResult = (NSUInteger)objc_msgSend([NSTestClass class], @selector(classMethodWithLongNameForUniquenessPurposes2)); - STAssertTrue(testClassMethodResult == methodResult, @"check implementation of new method"); + XCTAssertTrue( testClassMethodResult == method_result_, @"check implementation of new method" ); firstTestRun = NO; } @@ -255,14 +264,16 @@ -(void)testAddInstanceMethodIfNeedWithSelector toClass:[NSTestClass class] newMethodSelector:newMethodSelector]; - STAssertTrue(result, @"method added"); + XCTAssertTrue(result, @"method added"); - STAssertTrue([NSTestClass hasInstanceMethodWithSelector:newMethodSelector], + + XCTAssertTrue([NSTestClass hasInstanceMethodWithSelector:newMethodSelector], @"NSTestClass has instanceMethodWithLongNameForUniquenessPurposes2 method"); + + NSTestClass* instance_ = [ NSTestClass new ]; - NSTestClass *instance = [NSTestClass new]; - NSUInteger methodResult = (NSUInteger)objc_msgSend(instance, newMethodSelector); - STAssertTrue(testInstanceMethodResult == methodResult, @"check implementation of new method" ); + NSUInteger method_result_ = FPropertyGetter( instance_, newMethodSelector ); + XCTAssertTrue( testInstanceMethodResult == method_result_, @"check implementation of new method" ); firstTestRun = NO; } @@ -277,7 +288,7 @@ -(void)testTwiceHookInstanceMethod NSTwiceTestClass *instance = [ NSTwiceTestClass new ]; - STAssertEquals(testInstanceMethodResult, + XCTAssertEqual(testInstanceMethodResult, [instance instanceMethodWithLongNameForUniquenessPurposes], @"result mismatch" ); @@ -286,11 +297,11 @@ -(void)testTwiceHookInstanceMethod prototypeMethodSelector:@selector(twicePrototypeMethod) hookMethodSelector:@selector(twiceHookMethod)]; - STAssertEquals(testInstanceMethodResult * 2, + XCTAssertEqual(testInstanceMethodResult * 2, [instance instanceMethodWithLongNameForUniquenessPurposes], @"result mismatch"); - STAssertThrows( { + XCTAssertThrows( { [[TwiceHookMethodsClass class] hookInstanceMethodForClass:[NSTwiceTestClass class] withSelector:@selector(instanceMethodWithLongNameForUniquenessPurposes) prototypeMethodSelector:@selector(twicePrototypeMethod) @@ -307,7 +318,7 @@ -(void)testTwiceHookClassMethod Class class = [NSTwiceTestClass class]; - STAssertEquals(testClassMethodResult, + XCTAssertEqual(testClassMethodResult, [class classMethodWithLongNameForUniquenessPurposes], @"result mismatch"); @@ -316,11 +327,11 @@ -(void)testTwiceHookClassMethod prototypeMethodSelector:@selector(twicePrototypeMethod) hookMethodSelector:@selector(twiceHookMethod)]; - STAssertEquals(testClassMethodResult * 3, + XCTAssertEqual(testClassMethodResult * 3, [class classMethodWithLongNameForUniquenessPurposes], @"result mismatch" ); - STAssertThrows({ + XCTAssertThrows({ [[TwiceHookMethodsClass class]hookClassMethodForClass:[NSTwiceTestClass class] withSelector:@selector(classMethodWithLongNameForUniquenessPurposes) prototypeMethodSelector:@selector(twicePrototypeMethod) diff --git a/lib/JFFUtils/JFFUtilsTest/NSObject_IsEqualTwoObjectsTest.h b/lib/JFFUtils/JFFUtilsTest/NSObject_IsEqualTwoObjectsTest.h index 354e006..e0d9659 100644 --- a/lib/JFFUtils/JFFUtilsTest/NSObject_IsEqualTwoObjectsTest.h +++ b/lib/JFFUtils/JFFUtilsTest/NSObject_IsEqualTwoObjectsTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface NSObject_IsEqualTwoObjectsTest : SenTestCase +@interface NSObject_IsEqualTwoObjectsTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/NSObject_IsEqualTwoObjectsTest.m b/lib/JFFUtils/JFFUtilsTest/NSObject_IsEqualTwoObjectsTest.m index b6ac9be..68828d2 100644 --- a/lib/JFFUtils/JFFUtilsTest/NSObject_IsEqualTwoObjectsTest.m +++ b/lib/JFFUtils/JFFUtilsTest/NSObject_IsEqualTwoObjectsTest.m @@ -8,48 +8,48 @@ -(void)testIsEqualTwoObjects NSObject *object1; NSObject *object2; - STAssertTrue([NSObject object: object1 - isEqualTo: object2], nil); + XCTAssertTrue([NSObject object: object1 + isEqualTo: object2]); } { NSObject *object1 = [NSObject new]; NSObject *object2 = [NSObject new]; - STAssertFalse([NSObject object: object1 - isEqualTo: object2], nil); + XCTAssertFalse([NSObject object: object1 + isEqualTo: object2]); } { NSObject *object1 = [NSObject new]; NSObject *object2 = object1; - STAssertTrue([NSObject object: object1 - isEqualTo: object2], nil); + XCTAssertTrue([NSObject object: object1 + isEqualTo: object2]); } { NSObject *object1; NSObject *object2 = @""; - STAssertFalse([NSObject object: object1 - isEqualTo: object2], nil); + XCTAssertFalse([NSObject object: object1 + isEqualTo: object2]); } { NSObject *object1 = @""; NSObject *object2; - STAssertFalse([NSObject object: object1 - isEqualTo: object2], nil); + XCTAssertFalse([NSObject object: object1 + isEqualTo: object2]); } { NSObject *object1 = @""; NSObject *object2 = @""; - STAssertTrue([NSObject object: object1 - isEqualTo: object2], nil ); + XCTAssertTrue([NSObject object: object1 + isEqualTo: object2]); } } diff --git a/lib/JFFUtils/JFFUtilsTest/NumberOfCharacterFromStringTest.h b/lib/JFFUtils/JFFUtilsTest/NumberOfCharacterFromStringTest.h index 49abd5e..6d825e1 100644 --- a/lib/JFFUtils/JFFUtilsTest/NumberOfCharacterFromStringTest.h +++ b/lib/JFFUtils/JFFUtilsTest/NumberOfCharacterFromStringTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface NumberOfCharacterFromStringTest : SenTestCase +@interface NumberOfCharacterFromStringTest : XCTestCase @end diff --git a/lib/JFFUtils/JFFUtilsTest/NumberOfCharacterFromStringTest.m b/lib/JFFUtils/JFFUtilsTest/NumberOfCharacterFromStringTest.m index 6608397..fdc203f 100644 --- a/lib/JFFUtils/JFFUtilsTest/NumberOfCharacterFromStringTest.m +++ b/lib/JFFUtils/JFFUtilsTest/NumberOfCharacterFromStringTest.m @@ -4,32 +4,32 @@ @implementation NumberOfCharacterFromStringTest -(void)testNumberOfCharacterFromString { - STAssertEquals((NSUInteger)0, [@"" numberOfCharacterFromString: @""], nil); + XCTAssertEqual((NSUInteger)0, [@"" numberOfCharacterFromString: @""]); - STAssertEquals((NSUInteger)0, [@"" numberOfCharacterFromString: @"1"], nil); + XCTAssertEqual((NSUInteger)0, [@"" numberOfCharacterFromString: @"1"]); - STAssertEquals((NSUInteger)2, [@"11" numberOfCharacterFromString: @"1"], nil); + XCTAssertEqual((NSUInteger)2, [@"11" numberOfCharacterFromString: @"1"]); - STAssertEquals((NSUInteger)2, [@"21212" numberOfCharacterFromString: @"1"], nil); + XCTAssertEqual((NSUInteger)2, [@"21212" numberOfCharacterFromString: @"1"]); - STAssertEquals((NSUInteger)5, [@"00021212000" numberOfCharacterFromString: @"21"], nil); + XCTAssertEqual((NSUInteger)5, [@"00021212000" numberOfCharacterFromString: @"21"]); - STAssertEquals((NSUInteger)7, [@"00032123120000" numberOfCharacterFromString: @"213"], nil); + XCTAssertEqual((NSUInteger)7, [@"00032123120000" numberOfCharacterFromString: @"213"]); } -(void)testNumberOfStringsFromString { - STAssertEquals((NSUInteger)3, [@"aaa" numberOfStringsFromString: @"a" ], nil); + XCTAssertEqual((NSUInteger)3, [@"aaa" numberOfStringsFromString: @"a" ]); - STAssertEquals((NSUInteger)1, [@"aaa" numberOfStringsFromString: @"aa" ], nil); + XCTAssertEqual((NSUInteger)1, [@"aaa" numberOfStringsFromString: @"aa" ]); - STAssertEquals((NSUInteger)1, [@"ab a" numberOfStringsFromString: @"ab" ], nil); + XCTAssertEqual((NSUInteger)1, [@"ab a" numberOfStringsFromString: @"ab" ]); - STAssertEquals((NSUInteger)1, [@"a abc" numberOfStringsFromString: @"abc" ], nil); + XCTAssertEqual((NSUInteger)1, [@"a abc" numberOfStringsFromString: @"abc" ]); - STAssertEquals((NSUInteger)0, [@"a ab c" numberOfStringsFromString: @"abc" ], nil); + XCTAssertEqual((NSUInteger)0, [@"a ab c" numberOfStringsFromString: @"abc" ]); - STAssertEquals((NSUInteger)3, [@"ababab" numberOfStringsFromString: @"ab" ], nil); + XCTAssertEqual((NSUInteger)3, [@"ababab" numberOfStringsFromString: @"ab" ]); } @end diff --git a/lib/JFFUtils/JFFUtilsTest/ObjcDynamicCastTest.h b/lib/JFFUtils/JFFUtilsTest/ObjcDynamicCastTest.h index a233e32..e75d8e4 100644 --- a/lib/JFFUtils/JFFUtilsTest/ObjcDynamicCastTest.h +++ b/lib/JFFUtils/JFFUtilsTest/ObjcDynamicCastTest.h @@ -1,7 +1,7 @@ -#import +#import #import -@interface ObjcDynamicCastTest : SenTestCase +@interface ObjcDynamicCastTest : XCTestCase @end \ No newline at end of file diff --git a/lib/JFFUtils/JFFUtilsTest/ObjcDynamicCastTest.mm b/lib/JFFUtils/JFFUtilsTest/ObjcDynamicCastTest.mm index 367a45f..067fb7e 100644 --- a/lib/JFFUtils/JFFUtilsTest/ObjcDynamicCastTest.mm +++ b/lib/JFFUtils/JFFUtilsTest/ObjcDynamicCastTest.mm @@ -13,7 +13,7 @@ - (void)testDynamicCastReturnsNilForNil { result = objc_dynamic_cast(parent); - STAssertNil(result, @"nil expected"); + XCTAssertNil(result, @"nil expected"); } } @@ -24,7 +24,7 @@ - (void)testDynamicCastReturnsNilForChildren { result = objc_dynamic_cast(parent); - STAssertNil(result, @"nil expected"); + XCTAssertNil(result, @"nil expected"); } } @@ -35,8 +35,8 @@ -(void)testDynamicCastToSameTypeReturnsSameObject { result = objc_dynamic_cast(parent); - STAssertNotNil(result, @"nil expected"); - STAssertTrue(result == parent, @"same object expected"); + XCTAssertNotNil(result, @"nil expected"); + XCTAssertTrue(result == parent, @"same object expected"); } } @@ -51,18 +51,18 @@ -(void)testDynamicCastReturnsSameObjectForValidHierarchy { result = objc_dynamic_cast(p_child); - STAssertNotNil(result, @"nil expected"); - STAssertTrue(result == p_child, @"same object expected"); + XCTAssertNotNil(result, @"nil expected"); + XCTAssertTrue(result == p_child, @"same object expected"); } { result = objc_dynamic_cast(o_child); - STAssertNotNil(result, @"nil expected" ); - STAssertTrue(result == p_child, @"same object expected"); + XCTAssertNotNil(result, @"nil expected" ); + XCTAssertTrue(result == p_child, @"same object expected"); result = objc_dynamic_cast(o_child); - STAssertNotNil(result, @"nil expected" ); - STAssertTrue(result == p_child, @"same object expected"); + XCTAssertNotNil(result, @"nil expected" ); + XCTAssertTrue(result == p_child, @"same object expected"); } } diff --git a/lib/JFFUtils/JFFUtilsTest/StringFromTemplateString.h b/lib/JFFUtils/JFFUtilsTest/StringFromTemplateString.h index ea05c64..0773c55 100644 --- a/lib/JFFUtils/JFFUtilsTest/StringFromTemplateString.h +++ b/lib/JFFUtils/JFFUtilsTest/StringFromTemplateString.h @@ -1,5 +1,5 @@ -#import - -@interface StringFromTemplateString : SenTestCase +#import +@interface StringFromTemplateString : XCTestCase @end + diff --git a/lib/JFFUtils/JFFUtilsTest/StringFromTemplateString.m b/lib/JFFUtils/JFFUtilsTest/StringFromTemplateString.m index e026375..4048e6e 100644 --- a/lib/JFFUtils/JFFUtilsTest/StringFromTemplateString.m +++ b/lib/JFFUtils/JFFUtilsTest/StringFromTemplateString.m @@ -13,7 +13,7 @@ - (void)testStringFromTemplateString @"price" : @"$23", }]; - STAssertEqualObjects(@"3 months for $23/month", resultString, nil); + XCTAssertEqualObjects(@"3 months for $23/month", resultString, @"unexpected template result" ); } { @@ -25,7 +25,7 @@ - (void)testStringFromTemplateString @"price" : @"$23", }]; - STAssertEqualObjects(@"$23 months for 3/month", resultString, nil); + XCTAssertEqualObjects(@"$23 months for 3/month", resultString, @"unexpected template result"); } { @@ -37,7 +37,7 @@ - (void)testStringFromTemplateString @"price" : @"$23", }]; - STAssertEqualObjects(@"cc 3 months for $23", resultString, nil); + XCTAssertEqualObjects(@"cc 3 months for $23", resultString, @"unexpected template result"); } { @@ -49,7 +49,7 @@ - (void)testStringFromTemplateString @"price" : @"$23", }]; - STAssertEqualObjects(@"3$23", resultString, nil); + XCTAssertEqualObjects(@"3$23", resultString, @"unexpected template result"); } { @@ -60,7 +60,7 @@ - (void)testStringFromTemplateString @"monthCount" : @3, }]; - STAssertEqualObjects(@"${monthCount", resultString, nil); + XCTAssertEqualObjects(@"${monthCount", resultString, @"unexpected template result"); } { @@ -71,7 +71,7 @@ - (void)testStringFromTemplateString @"monthCount2" : @3, }]; - STAssertEqualObjects(@"${monthCount}", resultString, nil); + XCTAssertEqualObjects(@"${monthCount}", resultString, @"unexpected template result"); } } diff --git a/lib/JFFUtils/JFFUtilsTest/TypeSignatureTest.h b/lib/JFFUtils/JFFUtilsTest/TypeSignatureTest.h index 6e08bb6..a368afa 100644 --- a/lib/JFFUtils/JFFUtilsTest/TypeSignatureTest.h +++ b/lib/JFFUtils/JFFUtilsTest/TypeSignatureTest.h @@ -1,5 +1,5 @@ -#import - -@interface TypeSignatureTest : SenTestCase +#import +@interface TypeSignatureTest : XCTestCase @end + diff --git a/lib/JFFUtils/JFFUtilsTest/TypeSignatureTest.m b/lib/JFFUtils/JFFUtilsTest/TypeSignatureTest.m index cd98e6a..291e3c1 100644 --- a/lib/JFFUtils/JFFUtilsTest/TypeSignatureTest.m +++ b/lib/JFFUtils/JFFUtilsTest/TypeSignatureTest.m @@ -46,7 +46,7 @@ - (void)testGetReturnType char returnType[strlen(sinature) + 1]; sscanf(sinature, typeSignatureScanFormat, returnType); - STAssertTrue(strcmp(returnType, sig.methodReturnType) == 0, nil); + XCTAssertTrue(strcmp(returnType, sig.methodReturnType) == 0, @"methodReturnType mismatch"); } //"void *" return type @@ -65,7 +65,7 @@ - (void)testGetReturnType char returnType[strlen(sinature) + 1]; sscanf(sinature, typeSignatureScanFormat, returnType); - STAssertTrue(strcmp(returnType, sig.methodReturnType) == 0, nil); + XCTAssertTrue(strcmp(returnType, sig.methodReturnType) == 0, @"methodReturnType mismatch"); } //"BOOL" return type @@ -84,7 +84,7 @@ - (void)testGetReturnType char returnType[strlen(sinature) + 1]; sscanf(sinature, typeSignatureScanFormat, returnType); - STAssertTrue(strcmp(returnType, sig.methodReturnType) == 0, nil); + XCTAssertTrue(strcmp(returnType, sig.methodReturnType) == 0, @"methodReturnType mismatch"); } //"NSUInteger" return type @@ -107,7 +107,7 @@ - (void)testGetReturnType // NSLog(@"ret1: %s", returnType); // NSLog(@"ret2: %s", sig.methodReturnType); - STAssertTrue(strcmp(returnType, sig.methodReturnType) == 0, nil); + XCTAssertTrue(strcmp(returnType, sig.methodReturnType) == 0, @"methodReturnType mismatch"); } } @@ -124,7 +124,7 @@ - (void)testGetOffsets NSArray *arr = @[@20, @0, @4, @8, @12]; - STAssertEqualObjects(arr, typeEncodingOffsets(sinature), nil); + XCTAssertEqualObjects(arr, typeEncodingOffsets(sinature), @"method signature musmatch"); } { @@ -138,7 +138,7 @@ - (void)testGetOffsets NSArray *arr = @[@12, @0, @4, @8]; - STAssertEqualObjects(arr, typeEncodingOffsets(sinature), nil); + XCTAssertEqualObjects(arr, typeEncodingOffsets(sinature), @"method signature musmatch"); } { @@ -152,7 +152,7 @@ - (void)testGetOffsets NSArray *arr = @[@20, @0, @4, @8, @12]; - STAssertEqualObjects(arr, typeEncodingOffsets(sinature), nil); + XCTAssertEqualObjects(arr, typeEncodingOffsets(sinature), @"method signature musmatch"); } } diff --git a/lib/JFFUtils/JGCDAdditions.h b/lib/JFFUtils/JGCDAdditions.h index e931a6d..c97658d 100755 --- a/lib/JFFUtils/JGCDAdditions.h +++ b/lib/JFFUtils/JGCDAdditions.h @@ -6,11 +6,23 @@ #ifdef __cplusplus extern "C" { #endif - + dispatch_queue_t dispatch_queue_get_or_create(const char *label, dispatch_queue_attr_t attr); void dispatch_queue_release_by_label(const char *label); + + + // @adk : for XCTest where dispatch_creqte_queue() returns main queue + void dispatch_sync_check_queue(dispatch_queue_t queue, dispatch_queue_t currentQueue, dispatch_block_t block); + void dispatch_barrier_sync_check_queue(dispatch_queue_t queue, dispatch_queue_t currentQueue,dispatch_block_t block); + + // @adk : legacy + void safe_dispatch_sync(dispatch_queue_t queue, dispatch_block_t block); + + void safe_dispatch_barrier_sync(dispatch_queue_t queue, dispatch_block_t block); + + #ifdef __cplusplus } /* closing brace for extern "C" */ #endif diff --git a/lib/JFFUtils/JGCDAdditions.mm b/lib/JFFUtils/JGCDAdditions.mm index d15636d..ba625eb 100644 --- a/lib/JFFUtils/JGCDAdditions.mm +++ b/lib/JFFUtils/JGCDAdditions.mm @@ -30,3 +30,35 @@ void dispatch_queue_release_by_label(const char *label) dispatchByLabel.erase(label); } } + + +#pragma mark - +#pragma mark Legacy +void dispatch_sync_check_queue(dispatch_queue_t queue, dispatch_queue_t currentQueue, dispatch_block_t block) +{ + if (currentQueue != queue) { + dispatch_sync(queue, block); + } else { + block(); + } +} + +void dispatch_barrier_sync_check_queue(dispatch_queue_t queue, dispatch_queue_t currentQueue,dispatch_block_t block) +{ + if (currentQueue != queue) { + dispatch_barrier_sync(queue, block); + } else { + block(); + } +} + +void safe_dispatch_sync(dispatch_queue_t queue, dispatch_block_t block) +{ + dispatch_sync_check_queue(queue, dispatch_get_main_queue(), block); +} + +void safe_dispatch_barrier_sync(dispatch_queue_t queue, dispatch_block_t block) +{ + dispatch_barrier_sync_check_queue(queue, dispatch_get_main_queue(), block); +} + diff --git a/lib/JFFUtils/JSignedRange.h b/lib/JFFUtils/JSignedRange.h index f4038da..1d27053 100755 --- a/lib/JFFUtils/JSignedRange.h +++ b/lib/JFFUtils/JSignedRange.h @@ -8,6 +8,18 @@ typedef struct { NSInteger length; } JSignedRange; +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifndef __cplusplus +extern +#endif JSignedRange JSignedRangeMake(NSInteger location, NSInteger length); + +#ifdef __cplusplus +} +#endif #endif //JFFUTILS_JSIGNED_RANGE_H_INCLUDED diff --git a/lib/JFFUtils/Logger/JFFLogger.h b/lib/JFFUtils/Logger/JFFLogger.h index c6fb120..932eb58 100644 --- a/lib/JFFUtils/Logger/JFFLogger.h +++ b/lib/JFFUtils/Logger/JFFLogger.h @@ -2,7 +2,7 @@ @class JFFLogInfo; -typedef void(^JFFLogHandler)(NSString *log, NSString *level); +typedef void(^JFFLogHandler)(NSString *log, NSString *level, id context); @interface JFFLogger : NSObject @@ -10,6 +10,8 @@ typedef void(^JFFLogHandler)(NSString *log, NSString *level); + (void)logErrorWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2); ++ (void)logErrorWithContext:(id)context format:(NSString *)format, ... NS_FORMAT_FUNCTION(2,3); + + (void)logInfoWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2); @end diff --git a/lib/JFFUtils/Logger/JFFLogger.m b/lib/JFFUtils/Logger/JFFLogger.m index 1dc8db8..f199724 100644 --- a/lib/JFFUtils/Logger/JFFLogger.m +++ b/lib/JFFUtils/Logger/JFFLogger.m @@ -7,7 +7,7 @@ @implementation JFFLogger + (JFFLogHandler)logHandler { if (!logHandler) { - logHandler = ^(NSString *log, NSString *level) { + logHandler = ^(NSString *log, NSString *level, id context) { NSLog(@"%@: %@", level, log); }; } @@ -26,6 +26,21 @@ + (void)logErrorWithFormat:(NSString *)format, ... va_start(args, format); [self logInfoWithLevel:@"error" + context:nil + format:format + argList:args]; + + va_end(args); +} + ++ (void)logErrorWithContext:(id)context + format:(NSString *)format, ... +{ + va_list args; + va_start(args, format); + + [self logInfoWithLevel:@"error" + context:context format:format argList:args]; @@ -38,6 +53,7 @@ + (void)logInfoWithFormat:(NSString *)format, ... va_start(args, format); [self logInfoWithLevel:@"info" + context:nil format:format argList:args]; @@ -45,11 +61,12 @@ + (void)logInfoWithFormat:(NSString *)format, ... } + (void)logInfoWithLevel:(NSString *)level + context:(id)context format:(NSString *)format argList:(va_list)argList { NSString *str = [[NSString alloc] initWithFormat:format arguments:argList]; - [self logHandler](str, level); + [self logHandler](str, level, context); } @end diff --git a/lib/JFFUtils/MemoryManagement/JFFRuntimeInitializer.m b/lib/JFFUtils/MemoryManagement/JFFRuntimeInitializer.m index 288e5f7..453c717 100755 --- a/lib/JFFUtils/MemoryManagement/JFFRuntimeInitializer.m +++ b/lib/JFFUtils/MemoryManagement/JFFRuntimeInitializer.m @@ -24,6 +24,7 @@ - (void)deallocRemoveAssociatedObjectsPrototype + (void)load { + //TODO may be we can already remove this ??? [self hookInstanceMethodForClass:[NSObject class] withSelector:@selector(dealloc) prototypeMethodSelector:@selector(deallocRemoveAssociatedObjectsPrototype) diff --git a/lib/JFFUtils/NSDate/NSDate+DateDifference.m b/lib/JFFUtils/NSDate/NSDate+DateDifference.m index cc82f66..6df06a7 100644 --- a/lib/JFFUtils/NSDate/NSDate+DateDifference.m +++ b/lib/JFFUtils/NSDate/NSDate+DateDifference.m @@ -30,32 +30,33 @@ - (NSString *)dateDifferenceStringFromDate:(NSDate *)fromDate if ([components year]) { dateComponent = [components year]; result = dateComponent == 1 - ? NSLocalizedString(@"YEAR", nil) - : NSLocalizedString(@"YEARS", nil); + ?NSLocalizedString(@"YEAR" , nil) + :NSLocalizedString(@"YEARS", nil); } else if ([components month]) { dateComponent = [components month]; result = dateComponent == 1 - ? NSLocalizedString(@"MONTH", nil) - : NSLocalizedString(@"MONTHS", nil); + ?NSLocalizedString(@"MONTH" , nil) + :NSLocalizedString(@"MONTHS", nil); } else if ([components day]) { dateComponent = [components day]; result = dateComponent == 1 - ? NSLocalizedString(@"DAY", nil) - : NSLocalizedString(@"DAYS", nil); + ?NSLocalizedString(@"DAY" , nil) + :NSLocalizedString(@"DAYS", nil); } else if ([components minute]) { dateComponent = [components minute]; result = dateComponent == 1 - ? NSLocalizedString(@"MINUTE", nil) - : NSLocalizedString(@"MINUTES", nil); + ?NSLocalizedString(@"MINUTE" , nil) + :NSLocalizedString(@"MINUTES", nil); } else { dateComponent = [components second]; dateComponent = dateComponent < 1 ? 1 : dateComponent; result = dateComponent == 1 - ? NSLocalizedString(@"SECOND", nil) - : NSLocalizedString(@"SECONDS", nil); + ?NSLocalizedString(@"SECOND" , nil) + :NSLocalizedString(@"SECONDS", nil); } - NSString *numberStr = [[NSString alloc] initWithFormat:@"%lu ", (unsigned long)dateComponent]; + NSString *numberStr = [@(dateComponent) descriptionWithLocale:nil]; + numberStr = [numberStr stringByAppendingString:@" "]; result = [numberStr stringByAppendingString:result]; return result; diff --git a/lib/JFFUtils/NSObject/Details/DelegateProxy/JFFDelegateProxyClassMethods.m b/lib/JFFUtils/NSObject/Details/DelegateProxy/JFFDelegateProxyClassMethods.m index 3c8b24c..be2be0b 100644 --- a/lib/JFFUtils/NSObject/Details/DelegateProxy/JFFDelegateProxyClassMethods.m +++ b/lib/JFFUtils/NSObject/Details/DelegateProxy/JFFDelegateProxyClassMethods.m @@ -30,7 +30,9 @@ - (id)delegateGetterHookMethod if (proxy) return proxy; - return objc_msgSend(self, NSSelectorFromString(hookedGetterName)); + typedef id (*AlignMsgSendFunction)(id, SEL); + AlignMsgSendFunction alignFunction = (AlignMsgSendFunction)objc_msgSend; + return alignFunction(self, NSSelectorFromString(hookedGetterName)); } @end diff --git a/lib/JFFUtils/NSObject/NSObject+DelegateProxy.m b/lib/JFFUtils/NSObject/NSObject+DelegateProxy.m index c74be19..a736328 100644 --- a/lib/JFFUtils/NSObject/NSObject+DelegateProxy.m +++ b/lib/JFFUtils/NSObject/NSObject+DelegateProxy.m @@ -57,7 +57,9 @@ - (JFFProxyDelegatesDispatcher *)proxyDelegatesDispatcherForHookedGetterName:(NS return nil; } - id realDelegate = objc_msgSend(self, NSSelectorFromString(hookedGetterName)); + typedef id (*AlignMsgSendFunction)(id, SEL); + AlignMsgSendFunction alignFunction = (AlignMsgSendFunction)objc_msgSend; + id realDelegate = alignFunction(self, NSSelectorFromString(hookedGetterName)); JFFProxyDelegatesDispatcher *dispatcher = [JFFProxyDelegatesDispatcher newProxyDelegatesDispatcherWithRealDelegate:realDelegate diff --git a/lib/JFFUtils/NSString/NSString+CPlusPlus.h b/lib/JFFUtils/NSString/NSString+CPlusPlus.h index 972ebc7..0a39b4a 100755 --- a/lib/JFFUtils/NSString/NSString+CPlusPlus.h +++ b/lib/JFFUtils/NSString/NSString+CPlusPlus.h @@ -4,6 +4,6 @@ @interface NSString (CPlusPlus) - (std::string)toStlString; -+ (instancetype)stringWithStlStringNoCopy:( const std::string& )stlString_; ++ (instancetype)stringWithStlStringNoCopy:(const std::string &)stlString; @end diff --git a/lib/JFFUtils/NSString/NSString+CPlusPlus.mm b/lib/JFFUtils/NSString/NSString+CPlusPlus.mm index 6a4e197..6020dfe 100755 --- a/lib/JFFUtils/NSString/NSString+CPlusPlus.mm +++ b/lib/JFFUtils/NSString/NSString+CPlusPlus.mm @@ -10,8 +10,8 @@ @implementation NSString (CPlusPlus) std::string urlCppString ( - [self cStringUsingEncoding: NSUTF8StringEncoding], - [self lengthOfBytesUsingEncoding: NSUTF8StringEncoding] + [self cStringUsingEncoding:NSUTF8StringEncoding], + [self lengthOfBytesUsingEncoding:NSUTF8StringEncoding] ); return urlCppString; diff --git a/scripts/simulator/CleanTestReports.sh b/scripts/simulator/CleanTestReports.sh index 6f419f5..fe204a5 100755 --- a/scripts/simulator/CleanTestReports.sh +++ b/scripts/simulator/CleanTestReports.sh @@ -5,6 +5,6 @@ ## rm -r -f "$TEST_RESULTS_DIR" -cd ~/Library/Application\ Support/iPhone\ Simulator/7.0/ +cd ~/Library/Application\ Support/iPhone\ Simulator/7.0.3/ rm -rf Applications mkdir -p Applications diff --git a/scripts/simulator/CopyTestReports.sh b/scripts/simulator/CopyTestReports.sh index 5d4ccb6..43cc135 100755 --- a/scripts/simulator/CopyTestReports.sh +++ b/scripts/simulator/CopyTestReports.sh @@ -18,7 +18,7 @@ rm -r -f "$TEST_PUBLISH_DIR" mkdir -p "$TEST_PUBLISH_DIR" -cd ~/Library/Application\ Support/iPhone\ Simulator/7.0/Applications +cd ~/Library/Application\ Support/iPhone\ Simulator/7.0.3/Applications for directory in $( ls -1 ); do echo "$directory/tmp/test-results" ls -1 "$directory/tmp/test-results" diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest.xcodeproj/project.pbxproj b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest.xcodeproj/project.pbxproj index 8ec79f0..cde069a 100644 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest.xcodeproj/project.pbxproj +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ 1B0E89DF1563FB1100825E3C /* libc++.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B0E89DE1563FB1100825E3C /* libc++.dylib */; }; - 1B12CB3B144D5C5900DFE2B1 /* JFFAsyncOperationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B12CB3A144D5C5900DFE2B1 /* JFFAsyncOperationManager.m */; }; 1B2D8C49154BFE7300360296 /* libJFFTestTools.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B2D8C46154BFE6400360296 /* libJFFTestTools.a */; }; 1B835A25142C8BC400FC004C /* libJFFAsyncOperations.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B835A20142C8BB300FC004C /* libJFFAsyncOperations.a */; }; 1B835A26142C8BC400FC004C /* libJFFUtils.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B835A16142C8BAB00FC004C /* libJFFUtils.a */; }; @@ -26,8 +25,10 @@ 1BEE3AFF15EFA9D40024D249 /* CachedAsyncOperationsTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 65977F8014A6731000AB83AE /* CachedAsyncOperationsTest.m */; }; 1BEE3B0015EFA9D40024D249 /* AsyncOperationBinder.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B7A10A314C036D900F37C95 /* AsyncOperationBinder.m */; }; 1BEE3B0115EFA9D40024D249 /* AsyncOperationWithDelayTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 65359B4D151A6DB90099D6FE /* AsyncOperationWithDelayTest.m */; }; + 4C0C3F6A1826EAC800984027 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C0C3F691826EAC800984027 /* QuartzCore.framework */; }; 4CCA7DFE17FEE7A300D85F5B /* SequenceWithAllResultTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCA7DFD17FEE7A300D85F5B /* SequenceWithAllResultTest.m */; }; 4CCA7E0117FEEA6100D85F5B /* SequenceWithSuccessfullResultTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCA7E0017FEEA6100D85F5B /* SequenceWithSuccessfullResultTest.m */; }; + 4CDB8E16182BE5A300C5BFA3 /* JFileDescriptorReaderTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CDB8E15182BE5A300C5BFA3 /* JFileDescriptorReaderTest.m */; }; 8D29EF8D13BE066900041B6A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D29EF8C13BE066900041B6A /* UIKit.framework */; }; 8D29EF8F13BE066900041B6A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D29EF8E13BE066900041B6A /* Foundation.framework */; }; 8D29EF9113BE066900041B6A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D29EF9013BE066900041B6A /* CoreGraphics.framework */; }; @@ -88,6 +89,13 @@ remoteGlobalIDString = D2AAC07E0554694100DB518D; remoteInfo = JFFScheduler; }; + 4C0C3F6E1826EAC800984027 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 1B835A18142C8BB300FC004C /* JFFAsyncOperations.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 4C1A0F8D182577BE0020FBF6; + remoteInfo = JFFAsyncOperationsMacOS; + }; 5357CDFC14A9F5130046EA34 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 1B835A18142C8BB300FC004C /* JFFAsyncOperations.xcodeproj */; @@ -156,8 +164,6 @@ /* Begin PBXFileReference section */ 1B0857D014516076001DDE0A /* FailOnFirstErrorGroupOfAsyncOperationsTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FailOnFirstErrorGroupOfAsyncOperationsTest.m; sourceTree = ""; }; 1B0E89DE1563FB1100825E3C /* libc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libc++.dylib"; path = "usr/lib/libc++.dylib"; sourceTree = SDKROOT; }; - 1B12CB39144D5C5900DFE2B1 /* JFFAsyncOperationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFAsyncOperationManager.h; sourceTree = ""; }; - 1B12CB3A144D5C5900DFE2B1 /* JFFAsyncOperationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFAsyncOperationManager.m; sourceTree = ""; }; 1B2A67C8143F474300BC284F /* JFFDidFinishAsyncOperationBlockHolderTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFDidFinishAsyncOperationBlockHolderTest.m; sourceTree = ""; }; 1B2A680C143F514C00BC284F /* JFFCancelAyncOperationBlockHolderTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFCancelAyncOperationBlockHolderTest.m; sourceTree = ""; }; 1B2D8C3E154BFE6400360296 /* JFFTestTools.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = JFFTestTools.xcodeproj; path = ../../lib/JFFTestTools/JFFTestTools.xcodeproj; sourceTree = ""; }; @@ -170,8 +176,10 @@ 1BA2551F1443114300C9B2BE /* SequenceOfAsyncOperationsTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SequenceOfAsyncOperationsTest.m; sourceTree = ""; }; 1BA27738144D9B1B00774C8E /* TrySequenceOfAsyncOperationsTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TrySequenceOfAsyncOperationsTest.m; sourceTree = ""; }; 1BED04FF144EBF2800B8DC2A /* GroupOfAsyncOperationsTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GroupOfAsyncOperationsTest.m; sourceTree = ""; }; + 4C0C3F691826EAC800984027 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 4CCA7DFD17FEE7A300D85F5B /* SequenceWithAllResultTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SequenceWithAllResultTest.m; sourceTree = ""; }; 4CCA7E0017FEEA6100D85F5B /* SequenceWithSuccessfullResultTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SequenceWithSuccessfullResultTest.m; sourceTree = ""; }; + 4CDB8E15182BE5A300C5BFA3 /* JFileDescriptorReaderTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFileDescriptorReaderTest.m; sourceTree = ""; }; 5357CDF914A9F5130046EA34 /* libstdc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libstdc++.dylib"; path = "usr/lib/libstdc++.dylib"; sourceTree = SDKROOT; }; 65359B4D151A6DB90099D6FE /* AsyncOperationWithDelayTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AsyncOperationWithDelayTest.m; sourceTree = ""; }; 65359BD5151A81C40099D6FE /* ParalelBlockTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ParalelBlockTest.m; sourceTree = ""; }; @@ -195,6 +203,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 4C0C3F6A1826EAC800984027 /* QuartzCore.framework in Frameworks */, 1BEC48A4156A27660099DA6D /* libstdc++.dylib in Frameworks */, 1B0E89DF1563FB1100825E3C /* libc++.dylib in Frameworks */, 1B2D8C49154BFE7300360296 /* libJFFTestTools.a in Frameworks */, @@ -248,6 +257,7 @@ 1B835A20142C8BB300FC004C /* libJFFAsyncOperations.a */, 5357CDFD14A9F5130046EA34 /* libJFFAsyncOperations-clang.a */, 65003452151A646C008F16E7 /* JFFAsyncOperationsFW.framework */, + 4C0C3F6F1826EAC800984027 /* libJFFAsyncOperationsMacOS.a */, ); name = Products; sourceTree = ""; @@ -285,6 +295,7 @@ 8D29EF8B13BE066900041B6A /* Frameworks */ = { isa = PBXGroup; children = ( + 4C0C3F691826EAC800984027 /* QuartzCore.framework */, 1B0E89DE1563FB1100825E3C /* libc++.dylib */, 5357CDF914A9F5130046EA34 /* libstdc++.dylib */, 8D29EFB213BE070F00041B6A /* GHUnitIOS.framework */, @@ -315,6 +326,7 @@ CEBCFC1D163D42AB0009772F /* JFFLimitedLoadersQueueTest.m */, 4CCA7DFD17FEE7A300D85F5B /* SequenceWithAllResultTest.m */, 4CCA7E0017FEEA6100D85F5B /* SequenceWithSuccessfullResultTest.m */, + 4CDB8E15182BE5A300C5BFA3 /* JFileDescriptorReaderTest.m */, ); path = JFFAsyncOperationsTest; sourceTree = ""; @@ -326,8 +338,6 @@ 8D29EF9513BE066900041B6A /* InfoPlist.strings */, 8D29EF9813BE066900041B6A /* main.m */, 8D29EF9A13BE066900041B6A /* JFFAsyncOperationsTest-Prefix.pch */, - 1B12CB39144D5C5900DFE2B1 /* JFFAsyncOperationManager.h */, - 1B12CB3A144D5C5900DFE2B1 /* JFFAsyncOperationManager.m */, ); name = "Supporting Files"; sourceTree = ""; @@ -428,6 +438,13 @@ remoteRef = 1B835B59142CD17300FC004C /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 4C0C3F6F1826EAC800984027 /* libJFFAsyncOperationsMacOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libJFFAsyncOperationsMacOS.a; + remoteRef = 4C0C3F6E1826EAC800984027 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 5357CDFD14A9F5130046EA34 /* libJFFAsyncOperations-clang.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -529,8 +546,8 @@ buildActionMask = 2147483647; files = ( 4CCA7E0117FEEA6100D85F5B /* SequenceWithSuccessfullResultTest.m in Sources */, + 4CDB8E16182BE5A300C5BFA3 /* JFileDescriptorReaderTest.m in Sources */, 8D29EF9913BE066900041B6A /* main.m in Sources */, - 1B12CB3B144D5C5900DFE2B1 /* JFFAsyncOperationManager.m in Sources */, 1BEE3AF115EFA9850024D249 /* TrySequenceOfAsyncOperationsTest.m in Sources */, 4CCA7DFE17FEE7A300D85F5B /* SequenceWithAllResultTest.m in Sources */, 1BEE3AF715EFA9A40024D249 /* ParalelBlockTest.m in Sources */, diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/AsyncOperationBinder.m b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/AsyncOperationBinder.m index d5c6447..f9c9c88 100755 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/AsyncOperationBinder.m +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/AsyncOperationBinder.m @@ -1,6 +1,4 @@ -#import "JFFAsyncOperationManager.h" - -#import +#import #import @interface AsyncMonadTest : GHTestCase @@ -8,71 +6,89 @@ @interface AsyncMonadTest : GHTestCase @implementation AsyncMonadTest --(void)setUp +- (void)setUp { - [JFFCancelAsyncOperationBlockHolder enableInstancesCounting]; + [JFFAsyncOperationHandlerBlockHolder enableInstancesCounting]; [JFFDidFinishAsyncOperationBlockHolder enableInstancesCounting]; [JFFAsyncOperationManager enableInstancesCounting]; } --(void)testNormalFinish +- (void)testNormalFinish { @autoreleasepool { - JFFAsyncOperationManager* firstLoader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* secondLoader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperation secondLoaderBlock_ = secondLoader_.loader; - - __block id monadResult_ = nil; - - JFFAsyncOperationBinder secondLoaderBinder_ = ^JFFAsyncOperation( id firstResult_ ) - { - monadResult_ = firstResult_; - return secondLoaderBlock_; + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperation secondLoaderBlock = secondLoader.loader; + + __block id monadResult = nil; + + JFFAsyncOperationBinder secondLoaderBinder = ^JFFAsyncOperation(id firstResult) { + + monadResult = firstResult; + return secondLoaderBlock; }; - JFFAsyncOperation asyncOp_ = bindSequenceOfAsyncOperations( firstLoader_.loader - , secondLoaderBinder_ - , nil ); - + JFFAsyncOperation asyncOp = bindSequenceOfAsyncOperations(firstLoader.loader, + secondLoaderBinder, + nil ); + __block id finalResult_ = nil; - - asyncOp_( nil, nil, ^( id result_, NSError* error_ ) - { + + asyncOp(nil, nil, ^(id result_, NSError *error_) { + finalResult_ = result_; - } ); - - id firstResult_ = @1; - firstLoader_.loaderFinishBlock.didFinishBlock( firstResult_, nil ); - - GHAssertTrue( monadResult_ == firstResult_, @"OK" ); - GHAssertFalse( secondLoader_.finished, @"OK" ); + }); + + id firstResult = @1; + firstLoader.loaderFinishBlock(firstResult, nil); + + GHAssertTrue( monadResult == firstResult, @"OK" ); + GHAssertFalse( secondLoader.finished, @"OK" ); GHAssertNil( finalResult_, @"OK" ); - + id secondResult_ = @2; - secondLoader_.loaderFinishBlock.didFinishBlock( secondResult_, nil ); - - GHAssertTrue( secondLoader_.finished, @"OK" ); + secondLoader.loaderFinishBlock(secondResult_, nil); + + GHAssertTrue( secondLoader.finished, @"OK" ); GHAssertTrue( finalResult_ == secondResult_, @"OK" ); } - - GHAssertTrue( 0 == [ JFFCancelAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFDidFinishAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFAsyncOperationManager instancesCount ], @"OK" ); + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } - (void)testFailFirstLoader { + NSUInteger instanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; + NSUInteger instanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; + NSUInteger instanceCount3 = [JFFAsyncOperationManager instancesCount]; + + __weak JFFAsyncOperationManager *firstLoader1; + __weak JFFAsyncOperationManager *secondLoader1; + + __weak NSObject *testBlockFreed1; + __weak NSObject *testBlockFreed2; + @autoreleasepool { JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; JFFAsyncOperation secondLoaderBlock = secondLoader.loader; + firstLoader1 = firstLoader; + secondLoader1 = secondLoader; + + NSObject *testBlockFreedTmp1 = [NSObject new]; + testBlockFreed1 = testBlockFreedTmp1; + __block NSError *finalError = nil; __block BOOL binderCalled = NO; - JFFAsyncOperationBinder secondLoaderBinder = ^JFFAsyncOperation( id firstResult_ ) { + JFFAsyncOperationBinder secondLoaderBinder = ^JFFAsyncOperation(id firstResult) { + + [testBlockFreed1 class]; binderCalled = YES; return secondLoaderBlock; }; @@ -80,20 +96,28 @@ - (void)testFailFirstLoader secondLoaderBinder, nil ); + NSObject *testBlockFreedTmp2 = [NSObject new]; + testBlockFreed2 = testBlockFreedTmp2; + asyncOp(nil, nil, ^(id result, NSError *error) { + + [testBlockFreed2 class]; finalError = error; }); NSError* failError = [JFFError newErrorWithDescription:@"error1"]; - firstLoader.loaderFinishBlock.didFinishBlock( nil, failError ); + firstLoader.loaderFinishBlock(nil, failError); GHAssertFalse(binderCalled, @"OK" ); GHAssertTrue(failError == finalError, @"OK" ); } - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); - GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); - GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); + GHAssertNil(testBlockFreed1, nil); + GHAssertNil(testBlockFreed2, nil); + + GHAssertTrue(instanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); + GHAssertTrue(instanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(instanceCount3 == [JFFAsyncOperationManager instancesCount], @"OK"); } @end diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/AsyncOperationWithDelayTest.m b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/AsyncOperationWithDelayTest.m index cbe40ae..61b9aa7 100755 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/AsyncOperationWithDelayTest.m +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/AsyncOperationWithDelayTest.m @@ -1,5 +1,3 @@ -#import "JFFAsyncOperationManager.h" - #import #import @@ -24,30 +22,30 @@ - (void)testCancelAsyncOperationWithDelay void (^block)(JFFSimpleBlock) = ^(JFFSimpleBlock complete) { @autoreleasepool { + JFFAsyncOperation loader = asyncOperationWithDelay(.2, .02); - JFFAsyncOperationProgressHandler progressCallback = ^(id data) { + JFFAsyncOperationProgressCallback progressCallback = ^(id data) { + complete(); }; - JFFCancelAsyncOperationHandler cancelCallback = ^(BOOL canceled) { - cancelBlockOk = canceled; - }; - JFFDidFinishAsyncOperationHandler doneCallback = ^(id result, NSError *error) { - complete(); + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { + + cancelBlockOk = [error isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]]; }; - JFFCancelAsyncOperation cancel = loader(progressCallback, - cancelCallback, - doneCallback); + JFFAsyncOperationHandler cancel = loader(progressCallback, + nil, + doneCallback); - cancel(YES); + cancel(JFFAsyncOperationHandlerTaskCancel); NSDate *startDate = [NSDate new]; asyncOperationWithDelay(.3, .03)(nil, nil, ^(id result, NSError *error) { + NSDate *finishDate = [NSDate new]; timeDifference = [finishDate timeIntervalSinceDate:startDate]; - complete(); }); } @@ -74,13 +72,13 @@ - (void)testAsyncOperationWithDelayTwiceCall @autoreleasepool { JFFAsyncOperation loader = asyncOperationWithDelay(.2, .02); - JFFAsyncOperationProgressHandler progressCallback = ^(id data) { + JFFAsyncOperationProgressCallback progressCallback = ^(id data) { complete(); }; - JFFCancelAsyncOperationHandler cancelCallback = ^(BOOL canceled) { + JFFAsyncOperationChangeStateCallback cancelCallback = ^(JFFAsyncOperationState state) { complete(); }; - JFFDidFinishAsyncOperationHandler doneCallback = ^(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { ++callsCount; if (callsCount == 2) complete(); diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/CachedAsyncOperationsTest.m b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/CachedAsyncOperationsTest.m index b252865..c3a1b4b 100644 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/CachedAsyncOperationsTest.m +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/CachedAsyncOperationsTest.m @@ -1,25 +1,22 @@ -#import "JFFAsyncOperationManager.h" - -#import +#import #import @interface TestClassWithProperties : NSObject -@property ( nonatomic ) NSMutableDictionary* dict; +@property (nonatomic) NSMutableDictionary *dict; @end @implementation TestClassWithProperties --(id)init +- (instancetype)init { - self = [ super init ]; - - if ( self ) - { - self->_dict = [ NSMutableDictionary new ]; + self = [super init]; + + if (self) { + _dict = [NSMutableDictionary new]; } - + return self; } @@ -30,219 +27,215 @@ @interface CachedAsyncOperationsTest : GHTestCase @implementation CachedAsyncOperationsTest --(void)setUp +- (void)setUp { - [ JFFCancelAsyncOperationBlockHolder enableInstancesCounting ]; - [ JFFDidFinishAsyncOperationBlockHolder enableInstancesCounting ]; - - [ JFFAsyncOperationManager enableInstancesCounting ]; + [JFFAsyncOperationHandlerBlockHolder enableInstancesCounting]; + [JFFDidFinishAsyncOperationBlockHolder enableInstancesCounting]; + + [JFFAsyncOperationManager enableInstancesCounting]; } --(void)testCachedAsyncOperationsCancel +- (void)testCachedAsyncOperationsCancel { @autoreleasepool { - JFFAsyncOperationManager* nativeLoader_ = [ JFFAsyncOperationManager new ]; - - JFFPropertyPath* propertyPath_ = [[JFFPropertyPath alloc] initWithName:@"dict" - key:@"1"]; + JFFAsyncOperationManager *nativeLoader = [JFFAsyncOperationManager new]; - JFFPropertyExtractorFactoryBlock factory_ = ^JFFPropertyExtractor*( void ) - { - return [ JFFPropertyExtractor new ]; + JFFPropertyPath *propertyPath = [[JFFPropertyPath alloc] initWithName:@"dict" key:@"1"]; + + JFFPropertyExtractorFactoryBlock factory = ^JFFPropertyExtractor *(void) { + + return [JFFPropertyExtractor new]; }; - TestClassWithProperties* dataOwner_ = [ TestClassWithProperties new ]; - + TestClassWithProperties *dataOwner = [TestClassWithProperties new]; + @autoreleasepool { - JFFAsyncOperation cachedLoader_ = [ dataOwner_ asyncOperationForPropertyWithPath: propertyPath_ - propertyExtractorFactoryBlock: factory_ - asyncOperation: nativeLoader_.loader - didFinishLoadDataBlock: nil ]; - - __block BOOL cancelFlag_ = NO; - JFFCancelAsyncOperationHandler cancel_callback_ = ^( BOOL canceled_ ) - { - cancelFlag_ = canceled_; + JFFAsyncOperation cachedLoader = [dataOwner asyncOperationForPropertyWithPath:propertyPath + propertyExtractorFactoryBlock:factory + asyncOperation:nativeLoader.loader + didFinishLoadDataBlock:nil]; + + __block NSError *finishError; + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { + + finishError = error; }; - - JFFCancelAsyncOperation cancel_ = cachedLoader_( nil, cancel_callback_, nil ); - - GHAssertFalse( nativeLoader_.finished , @"OK" ); - GHAssertFalse( nativeLoader_.canceled , @"OK" ); - GHAssertFalse( nativeLoader_.cancelFlag, @"OK" ); - - cancel_( YES ); - - GHAssertFalse( nativeLoader_.finished , @"OK" ); - GHAssertTrue ( nativeLoader_.canceled , @"OK" ); - GHAssertTrue ( nativeLoader_.cancelFlag, @"OK" ); - - GHAssertTrue( cancelFlag_, @"OK" ); + + JFFAsyncOperationHandler cancel = cachedLoader(nil, nil, doneCallback); + + GHAssertFalse(nativeLoader.finished, @"OK"); + GHAssertFalse(nativeLoader.canceled, @"OK"); + GHAssertTrue (nativeLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskUndefined, @"OK"); + + cancel(JFFAsyncOperationHandlerTaskCancel); + + GHAssertFalse(nativeLoader.finished , @"OK"); + GHAssertTrue (nativeLoader.canceled , @"OK"); + GHAssertTrue (nativeLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"OK"); + + GHAssertTrue([finishError isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]], @"OK"); } - } - - GHAssertTrue( 0 == [ JFFCancelAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFDidFinishAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFAsyncOperationManager instancesCount ], @"OK" ); + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } --(void)testCachedAsyncOperationsUnsibscribe +- (void)testCachedAsyncOperationsUnsibscribe { @autoreleasepool { - JFFAsyncOperationManager* nativeLoader_ = [ JFFAsyncOperationManager new ]; - - JFFPropertyPath* propertyPath_ = [ [ JFFPropertyPath alloc ] initWithName: @"dict" - key: @"1" ]; - - JFFPropertyExtractorFactoryBlock factory_ = ^JFFPropertyExtractor*( void ) - { - return [ JFFPropertyExtractor new ]; + JFFAsyncOperationManager *nativeLoader = [JFFAsyncOperationManager new]; + + JFFPropertyPath *propertyPath = [[JFFPropertyPath alloc] initWithName:@"dict" + key:@"1"]; + + JFFPropertyExtractorFactoryBlock factory = ^JFFPropertyExtractor *(void) { + + return [JFFPropertyExtractor new]; }; - - TestClassWithProperties* dataOwner_ = [ TestClassWithProperties new ]; - - JFFAsyncOperation cachedLoader_ = [ dataOwner_ asyncOperationForPropertyWithPath: propertyPath_ - propertyExtractorFactoryBlock: factory_ - asyncOperation: nativeLoader_.loader - didFinishLoadDataBlock: nil ]; - - __block BOOL cancelFlag_ = YES; - JFFCancelAsyncOperationHandler cancel_callback_ = ^( BOOL canceled_ ) - { - cancelFlag_ = canceled_; + + TestClassWithProperties *dataOwner = [TestClassWithProperties new]; + + JFFAsyncOperation cachedLoader = [dataOwner asyncOperationForPropertyWithPath:propertyPath + propertyExtractorFactoryBlock:factory + asyncOperation:nativeLoader.loader + didFinishLoadDataBlock:nil]; + + __block NSError *resultError; + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { + + resultError = error; }; - - JFFCancelAsyncOperation cancel_ = cachedLoader_( nil, cancel_callback_, nil ); - - GHAssertFalse( nativeLoader_.finished , @"OK" ); - GHAssertFalse( nativeLoader_.canceled , @"OK" ); - GHAssertFalse( nativeLoader_.cancelFlag, @"OK" ); - - cancel_( NO ); - - GHAssertFalse( nativeLoader_.finished , @"OK" ); - GHAssertFalse( nativeLoader_.canceled , @"OK" ); - GHAssertFalse( nativeLoader_.cancelFlag, @"OK" ); - - GHAssertFalse( cancelFlag_, @"OK" ); - cancelFlag_ = YES; - - nativeLoader_.loaderCancelBlock.onceCancelBlock( NO ); - - GHAssertTrue( cancelFlag_, @"OK" ); + + JFFAsyncOperationHandler cancel = cachedLoader(nil, nil, doneCallback); + + GHAssertFalse(nativeLoader.finished, @"OK"); + GHAssertFalse(nativeLoader.canceled, @"OK"); + GHAssertTrue(nativeLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskUndefined, @"OK"); + + cancel(JFFAsyncOperationHandlerTaskUnsubscribe); + + GHAssertFalse(nativeLoader.finished , @"OK"); + GHAssertFalse(nativeLoader.canceled , @"OK"); + GHAssertTrue(nativeLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskUndefined, @"OK"); + + GHAssertTrue([resultError isKindOfClass:[JFFAsyncOpFinishedByUnsubscriptionError class]], @"OK"); + resultError = nil; + + nativeLoader.loaderHandlerBlock(JFFAsyncOperationHandlerTaskUnsubscribe); + + GHAssertNil(resultError, @"OK"); } - - GHAssertTrue( 0 == [ JFFCancelAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFDidFinishAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFAsyncOperationManager instancesCount ], @"OK" ); + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } --(void)testCachedAsyncOperationsCancelNative +- (void)testCachedAsyncOperationsCancelNative { @autoreleasepool { - JFFAsyncOperationManager* nativeLoader_ = [ JFFAsyncOperationManager new ]; - - JFFPropertyPath* propertyPath_ = [ [ JFFPropertyPath alloc ] initWithName: @"dict" - key: @"1" ]; - - JFFPropertyExtractorFactoryBlock factory_ = ^JFFPropertyExtractor*( void ) + JFFAsyncOperationManager *nativeLoader = [JFFAsyncOperationManager new]; + + JFFPropertyPath* propertyPath = [[JFFPropertyPath alloc] initWithName:@"dict" + key:@"1"]; + + JFFPropertyExtractorFactoryBlock factory = ^JFFPropertyExtractor *(void) { - return [ JFFPropertyExtractor new ]; + return [JFFPropertyExtractor new]; }; - - TestClassWithProperties* dataOwner_ = [ TestClassWithProperties new ]; - - JFFAsyncOperation cachedLoader_ = [ dataOwner_ asyncOperationForPropertyWithPath: propertyPath_ - propertyExtractorFactoryBlock: factory_ - asyncOperation: nativeLoader_.loader - didFinishLoadDataBlock: nil ]; - - __block BOOL cancelFlag_ = NO; - JFFCancelAsyncOperationHandler cancel_callback_ = ^( BOOL canceled_ ) - { - cancelFlag_ = canceled_; + + TestClassWithProperties *dataOwner = [TestClassWithProperties new]; + + JFFAsyncOperation cachedLoader = [dataOwner asyncOperationForPropertyWithPath:propertyPath + propertyExtractorFactoryBlock:factory + asyncOperation:nativeLoader.loader + didFinishLoadDataBlock:nil]; + + __block NSError *resultError; + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { + resultError = error; }; - - JFFCancelAsyncOperation cancel_ = cachedLoader_( nil, cancel_callback_, nil ); - - GHAssertFalse( nativeLoader_.finished , @"OK" ); - GHAssertFalse( nativeLoader_.canceled , @"OK" ); - GHAssertFalse( nativeLoader_.cancelFlag, @"OK" ); - - nativeLoader_.loaderCancelBlock.onceCancelBlock( YES ); - - GHAssertFalse( nativeLoader_.finished , @"OK" ); - GHAssertTrue( nativeLoader_.canceled , @"OK" ); - GHAssertTrue( nativeLoader_.cancelFlag, @"OK" ); - - GHAssertTrue( cancelFlag_, @"OK" ); - cancelFlag_ = NO; - - cancel_( YES ); - - GHAssertFalse( cancelFlag_, @"OK" ); + + JFFAsyncOperationHandler cancel = cachedLoader(nil, nil, doneCallback); + + GHAssertFalse(nativeLoader.finished , @"OK"); + GHAssertFalse(nativeLoader.canceled , @"OK"); + GHAssertTrue(nativeLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskUndefined, @"OK"); + + nativeLoader.loaderHandlerBlock(JFFAsyncOperationHandlerTaskCancel); + + GHAssertFalse(nativeLoader.finished, @"OK" ); + GHAssertTrue(nativeLoader.canceled , @"OK" ); + GHAssertTrue(nativeLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"OK" ); + + GHAssertTrue([resultError isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]], @"OK"); + resultError = nil; + + cancel(JFFAsyncOperationHandlerTaskCancel); + + GHAssertNil(resultError, @"OK"); } - - GHAssertTrue( 0 == [ JFFCancelAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFDidFinishAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFAsyncOperationManager instancesCount ], @"OK" ); + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } --(void)testCachedAsyncOperationsUnsibscribeNative +- (void)testCachedAsyncOperationsUnsibscribeNative { @autoreleasepool { - JFFAsyncOperationManager* nativeLoader_ = [ JFFAsyncOperationManager new ]; - - JFFPropertyPath* propertyPath_ = [ [ JFFPropertyPath alloc ] initWithName: @"dict" - key: @"1" ]; - - JFFPropertyExtractorFactoryBlock factory_ = ^JFFPropertyExtractor*( void ) - { - return [ JFFPropertyExtractor new ]; + JFFAsyncOperationManager *nativeLoader = [JFFAsyncOperationManager new]; + + JFFPropertyPath *propertyPath = [[JFFPropertyPath alloc] initWithName:@"dict" + key:@"1"]; + + JFFPropertyExtractorFactoryBlock factory = ^JFFPropertyExtractor *(void) { + + return [JFFPropertyExtractor new]; }; - - TestClassWithProperties* dataOwner_ = [ TestClassWithProperties new ]; - - JFFAsyncOperation cachedLoader_ = [ dataOwner_ asyncOperationForPropertyWithPath: propertyPath_ - propertyExtractorFactoryBlock: factory_ - asyncOperation: nativeLoader_.loader - didFinishLoadDataBlock: nil ]; - - __block BOOL cancelFlag_ = YES; - JFFCancelAsyncOperationHandler cancelCallback_ = ^( BOOL canceled_ ) - { - cancelFlag_ = canceled_; + + TestClassWithProperties *dataOwner = [TestClassWithProperties new]; + + JFFAsyncOperation cachedLoader = [dataOwner asyncOperationForPropertyWithPath:propertyPath + propertyExtractorFactoryBlock:factory + asyncOperation:nativeLoader.loader + didFinishLoadDataBlock:nil]; + + __block NSError *resultError; + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { + resultError = error; }; - - JFFCancelAsyncOperation cancel_ = cachedLoader_( nil, cancelCallback_, nil ); - - GHAssertFalse( nativeLoader_.finished , @"OK" ); - GHAssertFalse( nativeLoader_.canceled , @"OK" ); - GHAssertFalse( nativeLoader_.cancelFlag, @"OK" ); - - nativeLoader_.loaderCancelBlock.onceCancelBlock( NO ); - - GHAssertFalse( nativeLoader_.finished , @"OK" ); - GHAssertTrue( nativeLoader_.canceled , @"OK" ); - GHAssertFalse( nativeLoader_.cancelFlag, @"OK" ); - - GHAssertFalse( cancelFlag_, @"OK" ); - cancelFlag_ = YES; - - cancel_( NO ); - - GHAssertTrue( cancelFlag_, @"OK" ); + + JFFAsyncOperationHandler cancel = cachedLoader(nil, nil, doneCallback); + + GHAssertFalse(nativeLoader.finished , @"OK"); + GHAssertFalse(nativeLoader.canceled , @"OK"); + GHAssertTrue(nativeLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskUndefined, @"OK"); + + nativeLoader.loaderHandlerBlock(JFFAsyncOperationHandlerTaskUnsubscribe); + + GHAssertFalse(nativeLoader.finished , @"OK"); + GHAssertTrue(nativeLoader.canceled , @"OK"); + GHAssertTrue(nativeLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskUnsubscribe, @"OK"); + + GHAssertTrue([resultError isKindOfClass:[JFFAsyncOpFinishedByUnsubscriptionError class]], @"OK" ); + resultError = nil; + + cancel(JFFAsyncOperationHandlerTaskUnsubscribe); + + GHAssertNil(resultError, @"OK"); } - - GHAssertTrue( 0 == [ JFFCancelAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFDidFinishAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFAsyncOperationManager instancesCount ], @"OK" ); + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } -(void)testCachedAsyncOperationsOnceLoading @@ -299,7 +292,7 @@ -(void)testCachedAsyncOperationsOnceLoading GHAssertTrue( dataOwner_.dict[@"1"] == nil, @"OK" ); id result_ = [ NSNull null ]; - nativeLoader.loaderFinishBlock.didFinishBlock( result_, nil ); + nativeLoader.loaderFinishBlock(result_, nil); GHAssertTrue( nativeLoader.finished, @"OK" ); GHAssertTrue( finished1_, @"OK" ); @@ -309,7 +302,7 @@ -(void)testCachedAsyncOperationsOnceLoading GHAssertTrue( dataOwner_.dict[@"1"] == result_, @"OK" ); } - GHAssertTrue( 0 == [ JFFCancelAsyncOperationBlockHolder instancesCount ], @"OK" ); + GHAssertTrue( 0 == [ JFFAsyncOperationHandlerBlockHolder instancesCount ], @"OK" ); GHAssertTrue( 0 == [ JFFDidFinishAsyncOperationBlockHolder instancesCount ], @"OK" ); GHAssertTrue( 0 == [ JFFAsyncOperationManager instancesCount ], @"OK" ); } @@ -355,12 +348,12 @@ -(void)testUnsubscribeBug unsubscribeLoader_(nil, nil, nil); } - nativeLoader_.loaderFinishBlock.didFinishBlock( [ NSNull null ], nil ); + nativeLoader_.loaderFinishBlock([NSNull null], nil); } - GHAssertTrue( deallocated_, @"OK" ); + GHAssertTrue(deallocated_, @"OK"); } - GHAssertTrue( 0 == [ JFFCancelAsyncOperationBlockHolder instancesCount ], @"OK" ); + GHAssertTrue( 0 == [ JFFAsyncOperationHandlerBlockHolder instancesCount ], @"OK" ); GHAssertTrue( 0 == [ JFFDidFinishAsyncOperationBlockHolder instancesCount ], @"OK" ); GHAssertTrue( 0 == [ JFFAsyncOperationManager instancesCount ], @"OK" ); } diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/FailOnFirstErrorGroupOfAsyncOperationsTest.m b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/FailOnFirstErrorGroupOfAsyncOperationsTest.m index 6fb3418..75c6c29 100644 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/FailOnFirstErrorGroupOfAsyncOperationsTest.m +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/FailOnFirstErrorGroupOfAsyncOperationsTest.m @@ -1,6 +1,4 @@ -#import "JFFAsyncOperationManager.h" - -#import +#import #import @interface FailOnFirstErrorGroupOfAsyncOperationsTest : GHTestCase @@ -8,188 +6,186 @@ @interface FailOnFirstErrorGroupOfAsyncOperationsTest : GHTestCase @implementation FailOnFirstErrorGroupOfAsyncOperationsTest --(void)setUp +- (void)setUp { - [ JFFCancelAsyncOperationBlockHolder enableInstancesCounting ]; - [ JFFDidFinishAsyncOperationBlockHolder enableInstancesCounting ]; - - [ JFFAsyncOperationManager enableInstancesCounting ]; + [JFFAsyncOperationHandlerBlockHolder enableInstancesCounting]; + [JFFDidFinishAsyncOperationBlockHolder enableInstancesCounting]; + + [JFFAsyncOperationManager enableInstancesCounting]; } //TODO cancel on fail one of sub loaders --(void)testNormalFinish +- (void)testNormalFinish { @autoreleasepool { JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; - JFFAsyncOperation loader_ = failOnFirstErrorGroupOfAsyncOperations(firstLoader.loader, - secondLoader.loader, - nil ); - - __block BOOL groupLoaderFinished_ = NO; - loader_( nil, nil, ^( id result_, NSError* error_ ) - { - if ( result_ && !error_ ) - { - groupLoaderFinished_ = YES; + JFFAsyncOperation loader = failOnFirstErrorGroupOfAsyncOperations(firstLoader.loader, + secondLoader.loader, + nil ); + + __block BOOL groupLoaderFinished = NO; + loader( nil, nil, ^(id result, NSError *error) { + + if (result && !error) { + + groupLoaderFinished = YES; } - } ); + }); + + GHAssertFalse(firstLoader.finished , @"First loader not finished yet" ); + GHAssertFalse(secondLoader.finished, @"Second loader not finished yet"); + GHAssertFalse(groupLoaderFinished , @"Group loader not finished yet" ); + + secondLoader.loaderFinishBlock([NSNull null], nil); + + GHAssertTrue (secondLoader.finished, @"Second loader finished already"); + GHAssertFalse(firstLoader.finished , @"First loader not finished yet" ); + GHAssertFalse(groupLoaderFinished , @"Group loader finished already" ); + + firstLoader.loaderFinishBlock([NSNull null], nil); - GHAssertFalse( firstLoader.finished, @"First loader not finished yet" ); - GHAssertFalse( secondLoader.finished, @"Second loader not finished yet" ); - GHAssertFalse( groupLoaderFinished_, @"Group loader not finished yet" ); - - secondLoader.loaderFinishBlock.didFinishBlock( [ NSNull null ], nil ); - - GHAssertTrue( secondLoader.finished, @"Second loader finished already" ); - GHAssertFalse( firstLoader.finished, @"First loader not finished yet" ); - GHAssertFalse( groupLoaderFinished_, @"Group loader finished already" ); - - firstLoader.loaderFinishBlock.didFinishBlock( [ NSNull null ], nil ); - GHAssertTrue( firstLoader.finished, @"First loader finished already" ); GHAssertTrue( secondLoader.finished, @"Second loader not finished yet" ); - GHAssertTrue( groupLoaderFinished_, @"Group loader finished already" ); - + GHAssertTrue( groupLoaderFinished, @"Group loader finished already" ); + } - - GHAssertTrue( 0 == [ JFFCancelAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFDidFinishAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFAsyncOperationManager instancesCount ], @"OK" ); + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } --(void)testFinishWithSecondError +- (void)testFinishWithSecondError { @autoreleasepool { - JFFAsyncOperationManager* firstLoader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* secondLoader_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation loader_ = failOnFirstErrorGroupOfAsyncOperations( firstLoader_.loader - , secondLoader_.loader - , nil ); - - __block BOOL mainCanceled_ = NO; - __block BOOL mainFinished_ = NO; - - JFFCancelAsyncOperationHandler cancelCallback_ = ^( BOOL canceled_ ) - { - mainCanceled_ = YES; + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; + + JFFAsyncOperation loader = failOnFirstErrorGroupOfAsyncOperations(firstLoader.loader, + secondLoader.loader, + nil); + + __block BOOL mainCanceled = NO; + __block BOOL mainFinished = NO; + + JFFAsyncOperationChangeStateCallback stateCallback = ^(JFFAsyncOperationState state) { + + mainCanceled = YES; }; - JFFDidFinishAsyncOperationHandler doneCallback_ = ^( id result_, NSError* error_ ) - { - mainFinished_ = ( result_ == nil ) && ( error_ != nil ); + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { + + mainFinished = (result == nil) && (error != nil); }; - - loader_( nil, cancelCallback_, doneCallback_ ); - - GHAssertFalse( firstLoader_.canceled, @"First loader not canceled yet" ); - GHAssertFalse( secondLoader_.canceled, @"Second loader not canceled yet" ); - GHAssertFalse( mainCanceled_, @"Group loader not canceled yet" ); - GHAssertFalse( mainFinished_, @"Group loader finished" ); - - secondLoader_.loaderFinishBlock.didFinishBlock( nil, [ JFFError newErrorWithDescription: @"some error" ] ); - - GHAssertTrue ( secondLoader_.finished, @"Second loader finished already" ); - GHAssertTrue ( firstLoader_.canceled, @"First loader not finished yet" ); - GHAssertTrue ( firstLoader_.cancelFlag, @"First loader not finished yet" ); - GHAssertFalse( mainCanceled_, @"Group loader canceled" ); - GHAssertTrue ( mainFinished_, @"Group loader finished" ); - + + loader(nil, stateCallback, doneCallback); + + GHAssertFalse(firstLoader.canceled, @"First loader not canceled yet" ); + GHAssertFalse(secondLoader.canceled, @"Second loader not canceled yet" ); + GHAssertFalse(mainCanceled, @"Group loader not canceled yet" ); + GHAssertFalse(mainFinished, @"Group loader finished" ); + + secondLoader.loaderFinishBlock(nil, [JFFError newErrorWithDescription:@"some error"]); + + GHAssertTrue (secondLoader.finished, @"Second loader finished already"); + GHAssertTrue (firstLoader.canceled, @"First loader not finished yet" ); + GHAssertTrue (firstLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"First loader not finished yet"); + GHAssertFalse(mainCanceled, @"Group loader canceled"); + GHAssertTrue (mainFinished, @"Group loader finished"); } - - GHAssertTrue( 0 == [ JFFCancelAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFDidFinishAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFAsyncOperationManager instancesCount ], @"OK" ); + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } --(void)testFinishWithFirstError +- (void)testFinishWithFirstError { @autoreleasepool { - JFFAsyncOperationManager* firstLoader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* secondLoader_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation loader_ = failOnFirstErrorGroupOfAsyncOperations( firstLoader_.loader - , secondLoader_.loader - , nil ); - - __block BOOL mainCanceled_ = NO; - __block BOOL mainFinished_ = NO; - - JFFCancelAsyncOperationHandler cancelCallback_ = ^( BOOL canceled_ ) - { - mainCanceled_ = YES; + JFFAsyncOperationManager *firstLoade = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; + + JFFAsyncOperation loader = failOnFirstErrorGroupOfAsyncOperations(firstLoade.loader, + secondLoader.loader, + nil); + + __block BOOL mainCanceled = NO; + __block BOOL mainFinished = NO; + + JFFAsyncOperationChangeStateCallback stateCallback = ^(JFFAsyncOperationState state) { + + mainCanceled = YES; }; - JFFDidFinishAsyncOperationHandler doneCallback_ = ^( id result_, NSError* error_ ) - { - mainFinished_ = ( result_ == nil ) && ( error_ != nil ); + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { + + mainFinished = (result == nil) && (error != nil); }; - - loader_( nil, cancelCallback_, doneCallback_ ); - - GHAssertFalse( firstLoader_.canceled, @"First loader not canceled yet" ); - GHAssertFalse( secondLoader_.canceled, @"Second loader not canceled yet" ); - GHAssertFalse( mainCanceled_, @"Group loader not canceled yet" ); - GHAssertFalse( mainFinished_, @"Group loader finished" ); - - firstLoader_.loaderFinishBlock.didFinishBlock( nil, [ JFFError newErrorWithDescription: @"some error" ] ); - - GHAssertTrue( firstLoader_.finished, @"First loader finished already" ); - GHAssertTrue( secondLoader_.canceled, @"Second loader not finished yet" ); - GHAssertTrue( secondLoader_.cancelFlag, @"Second loader not finished yet" ); - GHAssertFalse( mainCanceled_, @"Group loader canceled" ); - GHAssertTrue ( mainFinished_, @"Group loader finished" ); + + loader( nil, stateCallback, doneCallback ); + + GHAssertFalse(firstLoade.canceled, @"First loader not canceled yet" ); + GHAssertFalse(secondLoader.canceled, @"Second loader not canceled yet" ); + GHAssertFalse(mainCanceled, @"Group loader not canceled yet" ); + GHAssertFalse(mainFinished, @"Group loader finished" ); + + firstLoade.loaderFinishBlock(nil, [JFFError newErrorWithDescription:@"some error"]); + + GHAssertTrue(firstLoade.finished, @"First loader finished already" ); + GHAssertTrue(secondLoader.canceled, @"Second loader not finished yet" ); + GHAssertTrue(secondLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"Second loader not finished yet"); + GHAssertFalse(mainCanceled, @"Group loader canceled" ); + GHAssertTrue (mainFinished, @"Group loader finished" ); } - - GHAssertTrue( 0 == [ JFFCancelAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFDidFinishAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFAsyncOperationManager instancesCount ], @"OK" ); + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } --(void)testCancelFirstLoader +- (void)testCancelFirstLoader { @autoreleasepool { - JFFAsyncOperationManager* firstLoader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* secondLoader_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation loader_ = failOnFirstErrorGroupOfAsyncOperations( firstLoader_.loader - , secondLoader_.loader - , nil ); - - __block BOOL mainCanceled_ = NO; - __block BOOL onceCanceled_ = NO; - - loader_( nil, ^( BOOL unsubscribe_only_if_no_ ) - { - mainCanceled_ = unsubscribe_only_if_no_ && !onceCanceled_; - onceCanceled_ = YES; - }, nil ); - - GHAssertFalse( firstLoader_.canceled, @"First loader not canceled yet" ); - GHAssertFalse( secondLoader_.canceled, @"Second loader not canceled yet" ); - GHAssertFalse( mainCanceled_, @"Group loader not canceled yet" ); - - firstLoader_.loaderCancelBlock.onceCancelBlock( YES ); - - GHAssertTrue( firstLoader_.canceled, @"First loader canceled already" ); - GHAssertTrue( firstLoader_.cancelFlag, @"First loader canceled already" ); - GHAssertTrue( secondLoader_.canceled, @"Second loader canceled already" ); - GHAssertTrue( secondLoader_.cancelFlag, @"Second loader canceled already" ); - GHAssertTrue( mainCanceled_, @"Group loader canceled already" ); - + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; + + JFFAsyncOperation loader = failOnFirstErrorGroupOfAsyncOperations(firstLoader.loader, + secondLoader.loader, + nil); + + __block BOOL mainCanceled = NO; + __block BOOL onceCanceled = NO; + + loader(nil, nil, ^(id result, NSError *error) { + + mainCanceled = [error isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]] && !onceCanceled; + onceCanceled = YES; + }); + + GHAssertFalse(firstLoader .canceled, @"First loader not canceled yet" ); + GHAssertFalse(secondLoader.canceled, @"Second loader not canceled yet"); + GHAssertFalse(mainCanceled, @"Group loader not canceled yet" ); + + firstLoader.loaderHandlerBlock(JFFAsyncOperationHandlerTaskCancel); + + GHAssertTrue(firstLoader.canceled, @"First loader canceled already" ); + GHAssertTrue(firstLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"First loader canceled already" ); + GHAssertTrue(secondLoader.canceled, @"Second loader canceled already" ); + GHAssertTrue(secondLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"Second loader canceled already" ); + GHAssertTrue(mainCanceled, @"Group loader canceled already" ); } - - GHAssertTrue( 0 == [ JFFCancelAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFDidFinishAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFAsyncOperationManager instancesCount ], @"OK" ); + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } --(void)testCancelSecondLoader +- (void)testCancelSecondLoader { @autoreleasepool { @@ -197,77 +193,78 @@ -(void)testCancelSecondLoader JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; JFFAsyncOperation loader = failOnFirstErrorGroupOfAsyncOperations(firstLoader.loader, - secondLoader.loader, - nil); + secondLoader.loader, + nil); __block BOOL mainCanceled = NO; __block BOOL onceCanceled = NO; - JFFCancelAsyncOperationHandler cancelCallback = ^void(BOOL unsubscribeOnlyIfNo) { + loader(nil, nil, ^(id result, NSError *error) { - mainCanceled = !unsubscribeOnlyIfNo && !onceCanceled; + mainCanceled = [error isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]] && !onceCanceled; onceCanceled = YES; - }; - - loader( nil, cancelCallback, nil ); + }); - GHAssertFalse( firstLoader.canceled, @"First loader not canceled yet" ); - GHAssertFalse( secondLoader.canceled, @"Second loader not canceled yet" ); - GHAssertFalse( mainCanceled, @"Group loader not canceled yet" ); + GHAssertFalse(firstLoader.canceled , @"First loader not canceled yet" ); + GHAssertFalse(secondLoader.canceled, @"Second loader not canceled yet"); + GHAssertFalse(mainCanceled, @"Group loader not canceled yet" ); - secondLoader.loaderCancelBlock.onceCancelBlock( NO ); + secondLoader.loaderHandlerBlock(JFFAsyncOperationHandlerTaskCancel); - GHAssertTrue( firstLoader.canceled, @"First loader canceled already" ); - GHAssertFalse( firstLoader.cancelFlag, @"First loader canceled already" ); - GHAssertTrue( secondLoader.canceled, @"Second loader canceled already" ); - GHAssertFalse( secondLoader.cancelFlag, @"Second loader canceled already" ); - GHAssertTrue( mainCanceled, @"Group loader canceled already" ); + GHAssertTrue(firstLoader.canceled, @"First loader canceled already" );//not obligatory + GHAssertTrue(firstLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"First loader canceled already" ); + GHAssertTrue(secondLoader.canceled, @"Second loader canceled already" ); + GHAssertTrue(secondLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"Second loader canceled already" ); + GHAssertTrue(mainCanceled, @"Group loader canceled already" ); } - GHAssertTrue( 0 == [ JFFCancelAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFDidFinishAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFAsyncOperationManager instancesCount ], @"OK" ); + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } --(void)testCancelMainLoader +- (void)testCancelMainLoader { @autoreleasepool { - JFFAsyncOperationManager* firstLoader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* secondLoader_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation loader_ = failOnFirstErrorGroupOfAsyncOperations( firstLoader_.loader, secondLoader_.loader, nil ); - - __block BOOL main_canceled_ = NO; - __block BOOL once_canceled_ = NO; - - JFFCancelAsyncOperation cancel_ = loader_( nil, ^( BOOL unsubscribe_only_if_no_ ) - { - main_canceled_ = unsubscribe_only_if_no_ && !once_canceled_; - once_canceled_ = YES; - }, nil ); - - GHAssertFalse( firstLoader_.canceled, @"First loader not canceled yet" ); - GHAssertFalse( secondLoader_.canceled, @"Second loader not canceled yet" ); - GHAssertFalse( main_canceled_, @"Group loader not canceled yet" ); - - cancel_( YES ); - - GHAssertTrue( firstLoader_.canceled, @"First loader canceled already" ); - GHAssertTrue( firstLoader_.cancelFlag, @"First loader canceled already" ); - GHAssertTrue( secondLoader_.canceled, @"Second loader canceled already" ); - GHAssertTrue( secondLoader_.cancelFlag, @"Second loader canceled already" ); - GHAssertTrue( main_canceled_, @"Group loader canceled already" ); - + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; + + JFFAsyncOperation loader = failOnFirstErrorGroupOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); + + __block BOOL mainCanceled = NO; + __block BOOL onceCanceled = NO; + + JFFAsyncOperationHandler cancel = loader(nil, nil, ^(id result, NSError *error) { + + mainCanceled = [error isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]] && !onceCanceled; + onceCanceled = YES; + }); + + GHAssertFalse(firstLoader.canceled, @"First loader not canceled yet" ); + GHAssertFalse(secondLoader.canceled, @"Second loader not canceled yet" ); + GHAssertFalse(mainCanceled, @"Group loader not canceled yet" ); + + cancel(JFFAsyncOperationHandlerTaskCancel); + + GHAssertTrue(firstLoader.canceled , @"First loader canceled already" ); + GHAssertTrue(firstLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"First loader canceled already" ); + GHAssertTrue(secondLoader.canceled , @"Second loader canceled already"); + GHAssertTrue(secondLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"Second loader canceled already"); + GHAssertTrue(mainCanceled, @"Group loader canceled already"); } - - GHAssertTrue( 0 == [ JFFCancelAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFDidFinishAsyncOperationBlockHolder instancesCount ], @"OK" ); - GHAssertTrue( 0 == [ JFFAsyncOperationManager instancesCount ], @"OK" ); + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } - (void)testImmediatelyCancelCallbackOfFirstLoader { + NSUInteger initialInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; + NSUInteger initialInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; + NSUInteger initialInstanceCount3 = [JFFAsyncOperationManager instancesCount]; + @autoreleasepool { JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; @@ -278,42 +275,38 @@ - (void)testImmediatelyCancelCallbackOfFirstLoader JFFAsyncOperation loader = failOnFirstErrorGroupOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); __block BOOL progressCallbackCalled = NO; - JFFAsyncOperationProgressHandler progressCallback = ^(id progressInfo) { + JFFAsyncOperationProgressCallback progressCallback = ^(id progressInfo) { progressCallbackCalled = YES; }; - __block NSNumber *cancelCallbackCallFlag = NO; + __block NSError *finishError; __block NSUInteger cancelCallbackNumberOfCalls = 0; - JFFCancelAsyncOperationHandler cancelCallback = ^(BOOL canceled) { - - ++cancelCallbackNumberOfCalls; - cancelCallbackCallFlag = @(canceled); - }; - __block BOOL doneCallbackCalled = NO; - JFFDidFinishAsyncOperationHandler doneCallback = ^(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { + + if ([error isKindOfClass:[JFFAsyncOperationAbstractFinishError class]]) + ++cancelCallbackNumberOfCalls; - doneCallbackCalled = YES; + finishError = error; }; - loader(progressCallback, cancelCallback, doneCallback); + loader(progressCallback, nil, doneCallback); GHAssertFalse(progressCallbackCalled, nil); - GHAssertEqualObjects(@YES, cancelCallbackCallFlag, nil); - GHAssertFalse(doneCallbackCalled, nil); + GHAssertTrue([finishError isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]], nil); GHAssertEquals((NSUInteger)1, cancelCallbackNumberOfCalls, nil); - GHAssertTrue(firstLoader .canceled, nil); - GHAssertTrue(secondLoader.canceled, nil); + GHAssertTrue (firstLoader .canceled, nil); + GHAssertFalse(secondLoader.canceled, nil); GHAssertEquals((NSUInteger)1, firstLoader .loadingCount, nil); - GHAssertEquals((NSUInteger)1, secondLoader.loadingCount, nil); + GHAssertEquals((NSUInteger)0, secondLoader.loadingCount, nil); } - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); - GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); - GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); + GHAssertTrue(initialInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); + GHAssertTrue(initialInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(initialInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"OK"); } - (void)testImmediatelyCancelCallbackOfSecondLoader @@ -328,30 +321,26 @@ - (void)testImmediatelyCancelCallbackOfSecondLoader JFFAsyncOperation loader = failOnFirstErrorGroupOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); __block BOOL progressCallbackCalled = NO; - JFFAsyncOperationProgressHandler progressCallback = ^(id progressInfo) { + JFFAsyncOperationProgressCallback progressCallback = ^(id progressInfo) { progressCallbackCalled = YES; }; - __block NSNumber *cancelCallbackCallFlag = NO; + __block NSError *finishError = NO; __block NSUInteger cancelCallbackNumberOfCalls = 0; - JFFCancelAsyncOperationHandler cancelCallback = ^(BOOL canceled) { - - ++cancelCallbackNumberOfCalls; - cancelCallbackCallFlag = @(canceled); - }; - __block BOOL doneCallbackCalled = NO; - JFFDidFinishAsyncOperationHandler doneCallback = ^(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { + + if ([error isKindOfClass:[JFFAsyncOperationAbstractFinishError class]]) + ++cancelCallbackNumberOfCalls; - doneCallbackCalled = YES; + finishError = error; }; - loader(progressCallback, cancelCallback, doneCallback); + loader(progressCallback, nil, doneCallback); GHAssertFalse(progressCallbackCalled, nil); - GHAssertEqualObjects(@YES, cancelCallbackCallFlag, nil); - GHAssertFalse(doneCallbackCalled, nil); + GHAssertTrue ([finishError isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]], nil); GHAssertEquals((NSUInteger)1, cancelCallbackNumberOfCalls, nil); GHAssertTrue(firstLoader .canceled, nil); @@ -361,7 +350,7 @@ - (void)testImmediatelyCancelCallbackOfSecondLoader GHAssertEquals((NSUInteger)1, secondLoader.loadingCount, nil); } - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/GroupOfAsyncOperationsTest.m b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/GroupOfAsyncOperationsTest.m index 8eb317d..415ba40 100644 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/GroupOfAsyncOperationsTest.m +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/GroupOfAsyncOperationsTest.m @@ -1,6 +1,4 @@ -#import "JFFAsyncOperationManager.h" - -#import +#import #import @interface GroupOfAsyncOperationsTest : GHTestCase @@ -8,15 +6,15 @@ @interface GroupOfAsyncOperationsTest : GHTestCase @implementation GroupOfAsyncOperationsTest --(void)setUp +- (void)setUp { - [ JFFCancelAsyncOperationBlockHolder enableInstancesCounting ]; - [ JFFDidFinishAsyncOperationBlockHolder enableInstancesCounting ]; - - [ JFFAsyncOperationManager enableInstancesCounting ]; + [JFFAsyncOperationHandlerBlockHolder enableInstancesCounting]; + [JFFDidFinishAsyncOperationBlockHolder enableInstancesCounting]; + + [JFFAsyncOperationManager enableInstancesCounting]; } --(void)testNormalFinish +- (void)testNormalFinish { @autoreleasepool { @@ -25,285 +23,274 @@ -(void)testNormalFinish JFFAsyncOperation loader = groupOfAsyncOperations(firstLoader.loader, secondLoader.loader, - nil ); - + nil); + __block BOOL group_loader_finished_ = NO; - loader( nil, nil, ^( id result_, NSError* error_ ) - { - if ( result_ && !error_ ) - { + loader(nil, nil, ^(id result_, NSError *error_) { + + if ( result_ && !error_ ) { + group_loader_finished_ = YES; } - } ); - - GHAssertFalse( firstLoader.finished, @"First loader not finished yet" ); - GHAssertFalse( secondLoader.finished, @"Second loader not finished yet" ); - GHAssertFalse( group_loader_finished_, @"Group loader not finished yet" ); - - secondLoader.loaderFinishBlock.didFinishBlock( [ NSNull null ], nil ); - + }); + + GHAssertFalse(firstLoader.finished, @"First loader not finished yet" ); + GHAssertFalse(secondLoader.finished, @"Second loader not finished yet"); + GHAssertFalse(group_loader_finished_, @"Group loader not finished yet"); + + secondLoader.loaderFinishBlock([ NSNull new], nil); + GHAssertTrue( secondLoader.finished, @"Second loader finished already" ); GHAssertFalse( firstLoader.finished, @"First loader not finished yet" ); GHAssertFalse( group_loader_finished_, @"Group loader finished already" ); - firstLoader.loaderFinishBlock.didFinishBlock( [ NSNull null ], nil ); + firstLoader.loaderFinishBlock([NSNull new], nil); GHAssertTrue( firstLoader.finished , @"First loader finished already" ); GHAssertTrue( secondLoader.finished, @"Second loader not finished yet" ); GHAssertTrue( group_loader_finished_, @"Group loader finished already" ); - } - - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } --(void)testFinishWithFirstError +- (void)testFinishWithFirstError { @autoreleasepool { - JFFAsyncOperationManager* first_loader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* second_loader_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation loader_ = groupOfAsyncOperations( first_loader_.loader, second_loader_.loader, nil ); + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; + + JFFAsyncOperation loader = groupOfAsyncOperations( firstLoader.loader, secondLoader.loader, nil ); - __block BOOL group_loader_failed_ = NO; - loader_( nil, nil, ^( id result_, NSError* error_ ) - { - if ( !result_ && error_ ) - { - group_loader_failed_ = YES; + __block BOOL groupLoaderFailed = NO; + loader( nil, nil, ^(id result, NSError *error) { + + if (!result && error) { + + groupLoaderFailed = YES; } - } ); - - GHAssertFalse( first_loader_.finished, @"First loader not finished yet" ); - GHAssertFalse( second_loader_.finished, @"Second loader not finished yet" ); - GHAssertFalse( group_loader_failed_, @"Group loader not failed yet" ); - - second_loader_.loaderFinishBlock.didFinishBlock( nil, [ JFFError newErrorWithDescription: @"some error" ] ); - - GHAssertTrue( second_loader_.finished, @"Second loader finished already" ); - GHAssertFalse( first_loader_.finished, @"First loader not finished yet" ); - GHAssertFalse( group_loader_failed_, @"Group loader failed already" ); - - first_loader_.loaderFinishBlock.didFinishBlock( [ NSNull null ], nil ); - - GHAssertTrue( first_loader_.finished, @"First loader finished already" ); - GHAssertTrue( second_loader_.finished, @"Second loader not finished yet" ); - GHAssertTrue( group_loader_failed_, @"Group loader failed already" ); - + }); + + GHAssertFalse(firstLoader .finished, @"First loader not finished yet" ); + GHAssertFalse(secondLoader.finished, @"Second loader not finished yet"); + GHAssertFalse(groupLoaderFailed, @"Group loader not failed yet" ); + + secondLoader.loaderFinishBlock(nil, [JFFError newErrorWithDescription:@"some error"]); + + GHAssertTrue( secondLoader.finished, @"Second loader finished already" ); + GHAssertFalse( firstLoader.finished, @"First loader not finished yet" ); + GHAssertFalse( groupLoaderFailed, @"Group loader failed already" ); + + firstLoader.loaderFinishBlock([NSNull null], nil); + + GHAssertTrue( firstLoader.finished, @"First loader finished already" ); + GHAssertTrue( secondLoader.finished, @"Second loader not finished yet" ); + GHAssertTrue( groupLoaderFailed, @"Group loader failed already" ); } - - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } --(void)testFinishWithSecondError +- (void)testFinishWithSecondError { @autoreleasepool { - JFFAsyncOperationManager* first_loader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* second_loader_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation loader_ = groupOfAsyncOperations( first_loader_.loader, second_loader_.loader, nil ); - - __block BOOL group_loader_failed_ = NO; - loader_( nil, nil, ^( id result_, NSError* error_ ) - { - if ( !result_ && error_ ) - { - group_loader_failed_ = YES; + JFFAsyncOperationManager *first_loader_ = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *second_loader_ = [JFFAsyncOperationManager new]; + + JFFAsyncOperation loader_ = groupOfAsyncOperations(first_loader_.loader, second_loader_.loader, nil); + + __block BOOL groupLoaderFailed = NO; + loader_( nil, nil, ^( id result_, NSError* error_ ) { + + if (!result_ && error_) { + + groupLoaderFailed = YES; } } ); - + GHAssertFalse( first_loader_.finished, @"First loader not finished yet" ); GHAssertFalse( second_loader_.finished, @"Second loader not finished yet" ); - GHAssertFalse( group_loader_failed_, @"Group loader not failed yet" ); - - second_loader_.loaderFinishBlock.didFinishBlock( [ NSNull null ], nil ); - + GHAssertFalse( groupLoaderFailed, @"Group loader not failed yet" ); + + second_loader_.loaderFinishBlock([NSNull null], nil); + GHAssertTrue( second_loader_.finished, @"Second loader finished already" ); GHAssertFalse( first_loader_.finished, @"First loader not finished yet" ); - GHAssertFalse( group_loader_failed_, @"Group loader failed already" ); - - first_loader_.loaderFinishBlock.didFinishBlock( nil, [ JFFError newErrorWithDescription: @"some error" ] ); - + GHAssertFalse( groupLoaderFailed, @"Group loader failed already" ); + + first_loader_.loaderFinishBlock(nil, [JFFError newErrorWithDescription:@"some error"]); + GHAssertTrue( first_loader_.finished, @"First loader finished already" ); GHAssertTrue( second_loader_.finished, @"Second loader not finished yet" ); - GHAssertTrue( group_loader_failed_, @"Group loader failed already" ); + GHAssertTrue( groupLoaderFailed, @"Group loader failed already" ); } - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } --(void)testCancelFirstLoader +- (void)testCancelFirstLoader { @autoreleasepool { - JFFAsyncOperationManager* first_loader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* second_loader_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation loader_ = groupOfAsyncOperations( first_loader_.loader, second_loader_.loader, nil ); - - __block BOOL main_canceled_ = NO; - __block BOOL once_canceled_ = NO; - - loader_( nil, ^( BOOL unsubscribe_only_if_no_ ) - { - main_canceled_ = unsubscribe_only_if_no_ && !once_canceled_; - once_canceled_ = YES; - }, nil ); - - GHAssertFalse( first_loader_.canceled, @"First loader not canceled yet" ); - GHAssertFalse( second_loader_.canceled, @"Second loader not canceled yet" ); - GHAssertFalse( main_canceled_, @"Group loader not canceled yet" ); - - first_loader_.loaderCancelBlock.onceCancelBlock( YES ); - - GHAssertTrue( first_loader_.canceled, @"First loader canceled already" ); - GHAssertTrue( first_loader_.cancelFlag, @"First loader canceled already" ); - GHAssertTrue( second_loader_.canceled, @"Second loader canceled already" ); - GHAssertTrue( second_loader_.cancelFlag, @"Second loader canceled already" ); - GHAssertTrue( main_canceled_, @"Group loader canceled already" ); - + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; + + JFFAsyncOperation loader = groupOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); + + __block BOOL mainCanceled = NO; + __block BOOL onceCanceled = NO; + + loader(nil, nil, ^(id result, NSError *error) { + + mainCanceled = [error isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]] && !onceCanceled; + onceCanceled = YES; + }); + + GHAssertFalse(firstLoader.canceled , @"First loader not canceled yet" ); + GHAssertFalse(secondLoader.canceled, @"Second loader not canceled yet"); + GHAssertFalse(mainCanceled, @"Group loader not canceled yet"); + + firstLoader.loaderHandlerBlock(JFFAsyncOperationHandlerTaskCancel); + + GHAssertTrue(firstLoader.canceled, @"First loader canceled already" ); + GHAssertTrue(firstLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"First loader canceled already"); + GHAssertTrue(secondLoader.canceled, @"Second loader canceled already" ); + GHAssertTrue(secondLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"Second loader canceled already" ); + GHAssertTrue(mainCanceled, @"Group loader canceled already" ); } - - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } --(void)testCancelSecondLoader +- (void)testCancelSecondLoader { @autoreleasepool { - JFFAsyncOperationManager* first_loader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* second_loader_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation loader_ = groupOfAsyncOperations( first_loader_.loader, second_loader_.loader, nil ); - - __block BOOL main_canceled_ = NO; - __block BOOL once_canceled_ = NO; - - loader_( nil, ^( BOOL unsubscribe_only_if_no_ ) - { - main_canceled_ = !unsubscribe_only_if_no_ && !once_canceled_; - once_canceled_ = YES; - }, nil ); - - GHAssertFalse( first_loader_.canceled, @"First loader not canceled yet" ); - GHAssertFalse( second_loader_.canceled, @"Second loader not canceled yet" ); - GHAssertFalse( main_canceled_, @"Group loader not canceled yet" ); - - second_loader_.loaderCancelBlock.onceCancelBlock( NO ); - - GHAssertTrue( first_loader_.canceled, @"First loader canceled already" ); - GHAssertFalse( first_loader_.cancelFlag, @"First loader canceled already" ); - GHAssertTrue( second_loader_.canceled, @"Second loader canceled already" ); - GHAssertFalse( second_loader_.cancelFlag, @"Second loader canceled already" ); - GHAssertTrue( main_canceled_, @"Group loader canceled already" ); - + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; + + JFFAsyncOperation loader = groupOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); + + __block BOOL mainCanceled = NO; + __block BOOL onceCanceled = NO; + + loader(nil, nil, ^(id result, NSError *error) { + + mainCanceled = [error isKindOfClass:[JFFAsyncOpFinishedByUnsubscriptionError class]] && !onceCanceled; + onceCanceled = YES; + }); + + GHAssertFalse(firstLoader.canceled , @"First loader not canceled yet" ); + GHAssertFalse(secondLoader.canceled, @"Second loader not canceled yet"); + GHAssertFalse(mainCanceled, @"Group loader not canceled yet"); + + secondLoader.loaderHandlerBlock(JFFAsyncOperationHandlerTaskUnsubscribe); + + GHAssertTrue(firstLoader.canceled, @"First loader canceled already" ); + GHAssertTrue(firstLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"First loader canceled already"); + GHAssertTrue(secondLoader.canceled, @"Second loader canceled already"); + GHAssertFalse(secondLoader.lastHandleFlag, @"Second loader canceled already" ); + GHAssertTrue(mainCanceled, @"Group loader canceled already"); } - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } --(void)testCancelMainLoader +- (void)testCancelMainLoader { @autoreleasepool { - JFFAsyncOperationManager* first_loader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* second_loader_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation loader_ = groupOfAsyncOperations( first_loader_.loader, second_loader_.loader, nil ); - - __block BOOL main_canceled_ = NO; - __block BOOL once_canceled_ = NO; - - JFFCancelAsyncOperation cancel_ = loader_( nil, ^( BOOL unsubscribe_only_if_no_ ) - { - main_canceled_ = unsubscribe_only_if_no_ && !once_canceled_; - once_canceled_ = YES; - }, nil ); - - GHAssertFalse( first_loader_.canceled, @"First loader not canceled yet" ); - GHAssertFalse( second_loader_.canceled, @"Second loader not canceled yet" ); - GHAssertFalse( main_canceled_, @"Group loader not canceled yet" ); - - cancel_( YES ); - - GHAssertTrue( first_loader_.canceled, @"First loader canceled already" ); - GHAssertTrue( first_loader_.cancelFlag, @"First loader canceled already" ); - GHAssertTrue( second_loader_.canceled, @"Second loader canceled already" ); - GHAssertTrue( second_loader_.cancelFlag, @"Second loader canceled already" ); - GHAssertTrue( main_canceled_, @"Group loader canceled already" ); - + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; + + JFFAsyncOperation loader = groupOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); + + __block BOOL mainCanceled = NO; + __block BOOL onceCanceled = NO; + + JFFAsyncOperationHandler cancel = loader(nil, nil, ^(id result, NSError *error) { + + mainCanceled = [error isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]] && !onceCanceled; + onceCanceled = YES; + }); + + GHAssertFalse(firstLoader .canceled, @"First loader not canceled yet" ); + GHAssertFalse(secondLoader.canceled, @"Second loader not canceled yet"); + GHAssertFalse(mainCanceled, @"Group loader not canceled yet" ); + + cancel(JFFAsyncOperationHandlerTaskCancel); + + GHAssertTrue(firstLoader.canceled, @"First loader canceled already" ); + GHAssertTrue(firstLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"First loader canceled already" ); + GHAssertTrue(secondLoader.canceled, @"Second loader canceled already" ); + GHAssertTrue(secondLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"Second loader canceled already" ); + GHAssertTrue(mainCanceled, @"Group loader canceled already" ); } - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } --(void)testCancelAfterResultFirstLoader +- (void)testCancelAfterResultFirstLoader { @autoreleasepool { - JFFAsyncOperationManager* first_loader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* second_loader_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation loader_ = groupOfAsyncOperations( first_loader_.loader, second_loader_.loader, nil ); - - __block BOOL main_canceled_ = NO; - __block BOOL once_canceled_ = NO; - - JFFCancelAsyncOperationHandler cancel_callback_ = ^( BOOL unsubscribe_only_if_no_ ) - { - main_canceled_ = unsubscribe_only_if_no_ && !once_canceled_; - once_canceled_ = YES; - }; + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; - __block BOOL group_loader_finished_ = NO; + JFFAsyncOperation loader = groupOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); - JFFDidFinishAsyncOperationHandler done_callback_ = ^void( id result_, NSError* error_ ) - { - group_loader_finished_ = YES; + __block BOOL mainCanceled = NO; + __block BOOL onceCanceled = NO; + __block BOOL groupLoaderFinished = NO; + + JFFDidFinishAsyncOperationCallback doneCallback = ^void(id result, NSError *error) { + + mainCanceled = [error isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]] && !onceCanceled; + onceCanceled = YES; + groupLoaderFinished = YES; }; - JFFCancelAsyncOperation cancel_ = loader_( nil, cancel_callback_, done_callback_ ); - - GHAssertFalse( first_loader_.canceled, @"First loader not canceled yet" ); - GHAssertFalse( second_loader_.canceled, @"Second loader not canceled yet" ); - GHAssertFalse( main_canceled_, @"Group loader not canceled yet" ); - - second_loader_.loaderFinishBlock.didFinishBlock( [ NSNull null ], nil ); - - GHAssertTrue( second_loader_.finished, @"Second loader finished already" ); - GHAssertFalse( first_loader_.finished, @"First loader not finished yet" ); - GHAssertFalse( group_loader_finished_, @"Group loader finished already" ); - - cancel_( YES ); - - GHAssertTrue( first_loader_.canceled, @"First loader canceled already" ); - GHAssertTrue( first_loader_.cancelFlag, @"First loader canceled already" ); - GHAssertFalse( second_loader_.canceled, @"Second loader canceled already" ); - GHAssertTrue( main_canceled_, @"Group loader canceled already" ); - + JFFAsyncOperationHandler cancel = loader(nil, nil, doneCallback); + + GHAssertFalse(firstLoader.canceled , @"First loader not canceled yet" ); + GHAssertFalse(secondLoader.canceled, @"Second loader not canceled yet"); + GHAssertFalse(mainCanceled, @"Group loader not canceled yet" ); + + secondLoader.loaderFinishBlock([NSNull new], nil); + + GHAssertTrue(secondLoader.finished, @"Second loader finished already"); + GHAssertFalse(firstLoader.finished, @"First loader not finished yet" ); + GHAssertFalse(groupLoaderFinished, @"Group loader finished already" ); + + cancel(JFFAsyncOperationHandlerTaskCancel); + + GHAssertTrue(firstLoader.canceled, @"First loader canceled already"); + GHAssertTrue(firstLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"First loader canceled already"); + GHAssertFalse(secondLoader.canceled, @"Second loader canceled already" ); + GHAssertTrue(mainCanceled, @"Group loader canceled already" ); } - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } -typedef JFFAsyncOperation (*MergeLoadersPtr)( JFFAsyncOperation, ... ); +typedef JFFAsyncOperation (*MergeLoadersPtr)(JFFAsyncOperation, ...); --(void)testResultOfGroupLoadersWithFunc:( MergeLoadersPtr )func_ +- (void)testResultOfGroupLoadersWithFunc:(MergeLoadersPtr)func { @autoreleasepool { @@ -311,89 +298,89 @@ -(void)testResultOfGroupLoadersWithFunc:( MergeLoadersPtr )func_ { for ( int j = 0; j < 2; ++j ) { - JFFAsyncOperationManager* first_loader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* second_loader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* third_loader_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation loader_ = func_( first_loader_ .loader - , second_loader_.loader - , third_loader_ .loader - , nil ); - - __block id resultContext_; - JFFDidFinishAsyncOperationHandler done_callback_ = ^void( id result_, NSError* error_ ) - { - resultContext_ = result_; + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *thirdLoader = [JFFAsyncOperationManager new]; + + JFFAsyncOperation loader = func(firstLoader .loader, + secondLoader.loader, + thirdLoader .loader, + nil); + + __block id resultContext; + JFFDidFinishAsyncOperationCallback doneCallback = ^void(id result, NSError *error) { + + resultContext = result; }; - loader_( nil, nil, done_callback_ ); - - NSArray* results_ = @[ @"0", @"1", @"2" ]; - NSArray* loadersResults_ = @[ first_loader_ .loaderFinishBlock.didFinishBlock - , second_loader_.loaderFinishBlock.didFinishBlock - , third_loader_ .loaderFinishBlock.didFinishBlock ]; - - NSMutableArray* indexes_ = [ NSMutableArray arrayWithArray: results_ ]; - - NSUInteger firstIndex_ = [ indexes_[ i ] integerValue ]; - [ indexes_ removeObject: indexes_[ i ] ]; - - NSUInteger secondIndex_ = [ indexes_[ j ] integerValue ]; - [ indexes_ removeObject: indexes_[ j ] ]; - - NSUInteger thirdIndex_ = [ indexes_[ 0 ] integerValue ]; - - JFFDidFinishAsyncOperationHandler loader1_ = loadersResults_[ firstIndex_ ]; - JFFDidFinishAsyncOperationHandler loader2_ = loadersResults_[ secondIndex_ ]; - JFFDidFinishAsyncOperationHandler loader3_ = loadersResults_[ thirdIndex_ ]; - - loader1_( results_[ firstIndex_ ], nil ); - loader2_( results_[ secondIndex_ ], nil ); - loader3_( results_[ thirdIndex_ ], nil ); - - GHAssertTrue( [ resultContext_ isEqual: results_ ], @"OK" ); + loader(nil, nil, doneCallback); + + NSArray *results = @[@"0", @"1", @"2"]; + NSArray *loadersResults = @[firstLoader .loaderFinishBlock, + secondLoader.loaderFinishBlock, + thirdLoader .loaderFinishBlock]; + + NSMutableArray *indexes = [NSMutableArray arrayWithArray:results]; + + NSUInteger firstIndex = [indexes[i] integerValue]; + [indexes removeObject:indexes[i]]; + + NSUInteger secondIndex = [indexes[j] integerValue]; + [indexes removeObject:indexes[j]]; + + NSUInteger thirdIndex = [indexes[0] integerValue]; + + JFFDidFinishAsyncOperationCallback loader1 = loadersResults[firstIndex ]; + JFFDidFinishAsyncOperationCallback loader2 = loadersResults[secondIndex]; + JFFDidFinishAsyncOperationCallback loader3 = loadersResults[thirdIndex ]; + + loader1(results[firstIndex ], nil); + loader2(results[secondIndex], nil); + loader3(results[thirdIndex ], nil); + + GHAssertTrue([resultContext isEqual:results], @"OK"); } } } - - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } --(void)testResultOfGroupLoaders +- (void)testResultOfGroupLoaders { - [ self testResultOfGroupLoadersWithFunc: &groupOfAsyncOperations ]; + [self testResultOfGroupLoadersWithFunc:&groupOfAsyncOperations]; } --(void)testResultOfFailOnFirstErrorGroupLoaders +- (void)testResultOfFailOnFirstErrorGroupLoaders { - [ self testResultOfGroupLoadersWithFunc: &failOnFirstErrorGroupOfAsyncOperations ]; + [self testResultOfGroupLoadersWithFunc:&failOnFirstErrorGroupOfAsyncOperations]; } --(void)testMemoryManagementOfGroupLoaders +- (void)testMemoryManagementOfGroupLoaders { __block BOOL result2WasDeallocated_ = NO; - __block BOOL result3WasDeallocated_ = NO; - + __block BOOL result3WasDeallocated = NO; + @autoreleasepool { - JFFAsyncOperationManager* loader5 = [ JFFAsyncOperationManager new ]; + JFFAsyncOperationManager *loader5 = [JFFAsyncOperationManager new]; @autoreleasepool { - JFFAsyncOperationManager* loader2_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* loader4 = [ JFFAsyncOperationManager new ]; - + JFFAsyncOperationManager *loader2 = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *loader4 = [JFFAsyncOperationManager new]; + @autoreleasepool { - JFFAsyncOperationManager* loader1_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* loader3_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation gr1Loader_ = groupOfAsyncOperations( loader1_.loader - , loader2_.loader - , nil ); - JFFAsyncOperation gr2Loader_ = groupOfAsyncOperations( loader3_.loader - , loader4.loader - , nil ); + JFFAsyncOperationManager *loader1 = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *loader3 = [JFFAsyncOperationManager new]; + + JFFAsyncOperation gr1Loader_ = groupOfAsyncOperations(loader1.loader, + loader2.loader, + nil); + JFFAsyncOperation gr2Loader_ = groupOfAsyncOperations(loader3.loader, + loader4.loader, + nil); JFFAsyncOperation loader_ = groupOfAsyncOperations( gr1Loader_ , gr2Loader_ @@ -402,49 +389,49 @@ -(void)testMemoryManagementOfGroupLoaders __block BOOL group_loader_finished_ = NO; - JFFDidFinishAsyncOperationHandler done_callback_ = ^void( id result_, NSError* error_ ) + JFFDidFinishAsyncOperationCallback done_callback_ = ^void( id result_, NSError* error_ ) { GHAssertFalse( result2WasDeallocated_, @"OK" ); - GHAssertFalse( result3WasDeallocated_, @"OK" ); + GHAssertFalse( result3WasDeallocated, @"OK" ); group_loader_finished_ = YES; }; loader_( nil, nil, done_callback_ ); GHAssertFalse( group_loader_finished_, @"First loader not canceled yet" ); - - loader1_.loaderFinishBlock.didFinishBlock( nil, [ JFFError newErrorWithDescription: @"some error" ] ); - + + loader1.loaderFinishBlock(nil, [JFFError newErrorWithDescription:@"some error"]); + { - NSObject* result3_ = [ NSObject new ]; - [ result3_ addOnDeallocBlock: ^ - { - result3WasDeallocated_ = YES; - } ]; - loader3_.loaderFinishBlock.didFinishBlock( result3_, nil ); + NSObject *result3 = [NSObject new]; + [result3 addOnDeallocBlock: ^void(void) { + + result3WasDeallocated = YES; + }]; + loader3.loaderFinishBlock(result3, nil); } } //@autoreleasepool { - NSObject* result2_ = [ NSObject new ]; - [ result2_ addOnDeallocBlock: ^ - { + NSObject *result2 = [NSObject new]; + [result2 addOnDeallocBlock: ^(void) { + result2WasDeallocated_ = YES; - } ]; - loader2_.loaderFinishBlock.didFinishBlock( result2_, nil ); + }]; + loader2.loaderFinishBlock(result2, nil); } - loader4.loaderFinishBlock.didFinishBlock([NSNull new], nil); + loader4.loaderFinishBlock([NSNull new], nil); } - loader5.loaderFinishBlock.didFinishBlock([NSNull null], nil); + loader5.loaderFinishBlock([NSNull null], nil); } GHAssertTrue(result2WasDeallocated_, @"OK"); - GHAssertTrue(result3WasDeallocated_, @"OK"); + GHAssertTrue(result3WasDeallocated, @"OK"); - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } @@ -478,40 +465,36 @@ - (void)testImmediatelyCancelCallbackOfFirstLoader JFFAsyncOperation loader = groupOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); __block BOOL progressCallbackCalled = NO; - JFFAsyncOperationProgressHandler progressCallback = ^(id progressInfo) { + JFFAsyncOperationProgressCallback progressCallback = ^(id progressInfo) { progressCallbackCalled = YES; }; - __block NSNumber *cancelCallbackCallFlag = NO; + __block NSError *finishError; __block NSUInteger cancelCallbackNumberOfCalls = 0; - JFFCancelAsyncOperationHandler cancelCallback = ^(BOOL canceled) { - - ++cancelCallbackNumberOfCalls; - cancelCallbackCallFlag = @(canceled); - }; - __block BOOL doneCallbackCalled = NO; - JFFDidFinishAsyncOperationHandler doneCallback = ^(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { + + if ([error isKindOfClass:[JFFAsyncOperationAbstractFinishError class]]) + ++cancelCallbackNumberOfCalls; - doneCallbackCalled = YES; + finishError = error; }; - loader(progressCallback, cancelCallback, doneCallback); + loader(progressCallback, nil, doneCallback); GHAssertFalse(progressCallbackCalled, nil); - GHAssertEqualObjects(@YES, cancelCallbackCallFlag, nil); - GHAssertFalse(doneCallbackCalled, nil); + GHAssertTrue([finishError isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]], nil); GHAssertEquals((NSUInteger)1, cancelCallbackNumberOfCalls, nil); - GHAssertTrue(firstLoader .canceled, nil); - GHAssertTrue(secondLoader.canceled, nil); + GHAssertTrue (firstLoader .canceled, nil); + GHAssertFalse(secondLoader.canceled, nil); GHAssertEquals((NSUInteger)1, firstLoader .loadingCount, nil); - GHAssertEquals((NSUInteger)1, secondLoader.loadingCount, nil); + GHAssertEquals((NSUInteger)0, secondLoader.loadingCount, nil); } - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } @@ -528,30 +511,26 @@ - (void)testImmediatelyCancelCallbackOfSecondLoader JFFAsyncOperation loader = groupOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); __block BOOL progressCallbackCalled = NO; - JFFAsyncOperationProgressHandler progressCallback = ^(id progressInfo) { + JFFAsyncOperationProgressCallback progressCallback = ^(id progressInfo) { progressCallbackCalled = YES; }; - __block NSNumber *cancelCallbackCallFlag = NO; + __block NSError *finishError; __block NSUInteger cancelCallbackNumberOfCalls = 0; - JFFCancelAsyncOperationHandler cancelCallback = ^(BOOL canceled) { - - ++cancelCallbackNumberOfCalls; - cancelCallbackCallFlag = @(canceled); - }; - __block BOOL doneCallbackCalled = NO; - JFFDidFinishAsyncOperationHandler doneCallback = ^(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { + + if ([error isKindOfClass:[JFFAsyncOperationAbstractFinishError class]]) + ++cancelCallbackNumberOfCalls; - doneCallbackCalled = YES; + finishError = error; }; - loader(progressCallback, cancelCallback, doneCallback); + loader(progressCallback, nil, doneCallback); GHAssertFalse(progressCallbackCalled, nil); - GHAssertEqualObjects(@YES, cancelCallbackCallFlag, nil); - GHAssertFalse(doneCallbackCalled, nil); + GHAssertTrue([finishError isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]], nil); GHAssertEquals((NSUInteger)1, cancelCallbackNumberOfCalls, nil); GHAssertTrue(firstLoader .canceled, nil); @@ -561,7 +540,7 @@ - (void)testImmediatelyCancelCallbackOfSecondLoader GHAssertEquals((NSUInteger)1, secondLoader.loadingCount, nil); } - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFAsyncOperationManager.m b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFAsyncOperationManager.m deleted file mode 100644 index 4244a0d..0000000 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFAsyncOperationManager.m +++ /dev/null @@ -1,96 +0,0 @@ -#import "JFFAsyncOperationManager.h" - -#import -#import - -@interface JFFAsyncOperationManager () - -@property (nonatomic) JFFDidFinishAsyncOperationBlockHolder *loaderFinishBlock; -@property (nonatomic) JFFCancelAsyncOperationBlockHolder *loaderCancelBlock; - -@property (nonatomic) NSUInteger loadingCount; -@property (nonatomic) BOOL finished; -@property (nonatomic) BOOL canceled; -@property (nonatomic) BOOL cancelFlag; - -@end - -@implementation JFFAsyncOperationManager - -- (JFFDidFinishAsyncOperationBlockHolder *)loaderFinishBlock -{ - if (!_loaderFinishBlock) { - - _loaderFinishBlock = [JFFDidFinishAsyncOperationBlockHolder new]; - } - - return _loaderFinishBlock; -} - -- (JFFCancelAsyncOperationBlockHolder *)loaderCancelBlock -{ - if (!_loaderCancelBlock) { - - _loaderCancelBlock = [JFFCancelAsyncOperationBlockHolder new]; - } - - return _loaderCancelBlock; -} - -- (void)clear -{ - _loaderFinishBlock = nil; - _loaderCancelBlock = nil; - _finished = NO; -} - -- (JFFAsyncOperation)loader -{ - return [^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progress_callback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { - - __weak JFFAsyncOperationManager *weakSelf = self; - - self.loadingCount += 1; - - if (self.cancelAtLoading > JFFDoNotCancelAsyncOperationManager) { - - self.canceled = YES; - if (cancelCallback) - cancelCallback(JFFCancelAsyncOperationManagerWithYesFlag == self.cancelAtLoading); - return JFFStubCancelAsyncOperationBlock; - } - - doneCallback = [doneCallback copy]; - - self.loaderFinishBlock.didFinishBlock = ^(id result, NSError *error) { - - weakSelf.loaderFinishBlock.didFinishBlock = nil; - weakSelf.loaderCancelBlock.cancelBlock = nil; - weakSelf.finished = YES; - if (doneCallback) - doneCallback(result, error); - }; - - if (self.finishAtLoading || self.failAtLoading) { - if (self.finishAtLoading) - self.loaderFinishBlock.didFinishBlock([NSNull null], nil); - else - self.loaderFinishBlock.didFinishBlock(nil, [JFFError newErrorWithDescription:@"some error"]); - return JFFStubCancelAsyncOperationBlock; - } - - cancelCallback = [cancelCallback copy]; - self.loaderCancelBlock.cancelBlock = ^(BOOL canceled) { - weakSelf.loaderFinishBlock.didFinishBlock = nil; - weakSelf.canceled = YES; - weakSelf.cancelFlag = canceled; - if (cancelCallback) - cancelCallback(canceled); - }; - return self.loaderCancelBlock.onceCancelBlock; - } copy]; -} - -@end diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFAsyncOperationUtilsTest.m b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFAsyncOperationUtilsTest.m index 83aeeaa..5e2e431 100644 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFAsyncOperationUtilsTest.m +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFAsyncOperationUtilsTest.m @@ -22,12 +22,12 @@ -(void)testCallingOfPregressBlock __block BOOL resultCalled = NO; - JFFDidFinishAsyncOperationHandler doneCallback = ^(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { resultCalled = YES; complete(); }; - JFFAsyncOperationProgressHandler progressCallback = ^(id info) { + JFFAsyncOperationProgressCallback progressCallback = ^(id info) { progressCalled = (info == resultObject); ++progressCallsCount; progressCalledBeforeResult = !resultCalled; diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFAsyncOperationsTest-Prefix.pch b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFAsyncOperationsTest-Prefix.pch index 82b6cb5..f4b8a2a 100755 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFAsyncOperationsTest-Prefix.pch +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFAsyncOperationsTest-Prefix.pch @@ -13,6 +13,7 @@ #import #import #import + #import #import diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFCancelAyncOperationBlockHolderTest.m b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFCancelAyncOperationBlockHolderTest.m index 203bfce..c8fcc26 100644 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFCancelAyncOperationBlockHolderTest.m +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFCancelAyncOperationBlockHolderTest.m @@ -1,54 +1,54 @@ -#import +#import -@interface JFFCancelAsyncOperationBlockHolderTest : GHTestCase +@interface JFFAsyncOperationHandlerBlockHolderTest : GHTestCase @end -@implementation JFFCancelAsyncOperationBlockHolderTest +@implementation JFFAsyncOperationHandlerBlockHolderTest -(void)testJFFCancelAsyncOperationBlockHolder { - __block BOOL holderDeallocated_ = NO; - + __block BOOL holderDeallocated = NO; + @autoreleasepool { - JFFCancelAsyncOperationBlockHolder* holder_ = [JFFCancelAsyncOperationBlockHolder new]; - [holder_ addOnDeallocBlock:^void(void) { + JFFAsyncOperationHandlerBlockHolder *holder = [JFFAsyncOperationHandlerBlockHolder new]; + [holder addOnDeallocBlock:^void(void) { - holderDeallocated_ = YES; + holderDeallocated = YES; }]; - __block BOOL blockContextDeallocated_ = NO; - __block NSUInteger cancelBlockCallsNumber_ = 0; - + __block BOOL blockContextDeallocated = NO; + __block NSUInteger cancelBlockCallsNumber = 0; + @autoreleasepool { - NSObject* blockContext_ = [ NSObject new ]; - [ blockContext_ addOnDeallocBlock: ^void( void ) - { - blockContextDeallocated_ = YES; - } ]; - - holder_.cancelBlock = ^( BOOL unsubscribeOnlyIfNo_ ) - { - if ( [ blockContext_ class ] ) - ++cancelBlockCallsNumber_; + NSObject *blockContext = [NSObject new]; + [blockContext addOnDeallocBlock:^void(void) { + + blockContextDeallocated = YES; + }]; + + holder.loaderHandler = ^(JFFAsyncOperationHandlerTask task) { + + if ([blockContext class]) + ++cancelBlockCallsNumber; }; } - GHAssertFalse(blockContextDeallocated_, @"context not deallocated"); + GHAssertFalse(blockContextDeallocated, @"context not deallocated"); - holder_.onceCancelBlock(NO); - - GHAssertTrue(nil == holder_.cancelBlock, @"cancel block empty" ); - GHAssertTrue(blockContextDeallocated_, @"context deallocated" ); - GHAssertTrue(1 == cancelBlockCallsNumber_, @"block once was called"); - - holder_.onceCancelBlock( NO ); - - GHAssertTrue( 1 == cancelBlockCallsNumber_, @"block still once was called" ); + holder.smartLoaderHandler(JFFAsyncOperationHandlerTaskUnsubscribe); + + GHAssertTrue(nil == holder.loaderHandler, @"cancel block empty" ); + GHAssertTrue(blockContextDeallocated, @"context deallocated" ); + GHAssertTrue(1 == cancelBlockCallsNumber, @"block once was called"); + + holder.smartLoaderHandler(JFFAsyncOperationHandlerTaskUnsubscribe); + + GHAssertTrue(1 == cancelBlockCallsNumber, @"block still once was called" ); } - - GHAssertTrue( holderDeallocated_, @"holder deallocated" ); + + GHAssertTrue(holderDeallocated, @"holder deallocated"); } @end diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFLimitedLoadersQueueTest.m b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFLimitedLoadersQueueTest.m index 96872b7..ef443d3 100644 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFLimitedLoadersQueueTest.m +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFFLimitedLoadersQueueTest.m @@ -1,6 +1,3 @@ - -#import "JFFAsyncOperationManager.h" - #import #import @@ -10,7 +7,7 @@ @interface JFFLimitedLoadersQueueTest : GHAsyncTestCase @implementation JFFLimitedLoadersQueueTest --(void)setUp +- (void)setUp { [JFFBaseLoaderOwner enableInstancesCounting]; } @@ -37,12 +34,12 @@ - (void)testPerormTwoBlocksAndOneWaits //1. perform 4 blocks with limit - 2 (any finished) balancedLoader1(nil, nil, nil); balancedLoader2(nil, nil, nil); - JFFCancelAsyncOperation cancelBalanced3 = balancedLoader3(nil, nil, nil); + JFFAsyncOperationHandler cancelBalanced3 = balancedLoader3(nil, nil, nil); - __block BOOL canceled4 = NO; - JFFCancelAsyncOperation cancelBalanced4 = balancedLoader4(nil, ^(BOOL canceled){ - canceled4 = canceled; - }, nil); + __block NSError *resultError; + JFFAsyncOperationHandler cancelBalanced4 = balancedLoader4(nil, nil, ^(id result, NSError *error) { + resultError = error; + }); //2. Check that only first two runned GHAssertTrue(loader1.loadingCount == 1, nil); @@ -51,7 +48,7 @@ - (void)testPerormTwoBlocksAndOneWaits GHAssertTrue(loader4.loadingCount == 0, nil); //3. Finish first, check that 3-th was runned - loader1.loaderFinishBlock.didFinishBlock([NSNull new], nil); + loader1.loaderFinishBlock([NSNull new], nil); GHAssertTrue(loader1.finished, nil); GHAssertTrue(loader2.loadingCount == 1, nil); GHAssertTrue(loader3.loadingCount == 1, nil); @@ -60,18 +57,18 @@ - (void)testPerormTwoBlocksAndOneWaits //5. Cancel 4-th and than 3-th, // check that 3-th native was canceled // check that 4-th was not runned - cancelBalanced4(YES); - cancelBalanced3(YES); + cancelBalanced4(JFFAsyncOperationHandlerTaskCancel); + cancelBalanced3(JFFAsyncOperationHandlerTaskCancel); GHAssertTrue(loader3.canceled, nil); GHAssertTrue(loader4.loadingCount == 0, nil); //6. Finish second, and check that all loader was finished or canceled - loader2.loaderFinishBlock.didFinishBlock([NSNull new], nil); + loader2.loaderFinishBlock([NSNull new], nil); GHAssertTrue(loader1.finished, nil); GHAssertTrue(loader2.finished, nil); GHAssertTrue(loader3.canceled, nil); - GHAssertTrue(canceled4 , nil); + GHAssertTrue([resultError isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]], nil); } GHAssertTrue(initialSchedulerInstancesCount == [JFFBaseLoaderOwner instancesCount], @"OK"); @@ -98,12 +95,12 @@ - (void)testOneOperationInQueue GHAssertTrue(loader1.loadingCount == 1, nil); GHAssertTrue(loader2.loadingCount == 0, nil); - loader1.loaderFinishBlock.didFinishBlock([NSNull new], nil); + loader1.loaderFinishBlock([NSNull new], nil); GHAssertTrue(loader1.finished, nil); GHAssertTrue(loader2.loadingCount == 1, nil); - loader2.loaderFinishBlock.didFinishBlock([NSNull new], nil); + loader2.loaderFinishBlock([NSNull new], nil); } GHAssertTrue(initialSchedulerInstancesCount == [JFFBaseLoaderOwner instancesCount], @"OK"); @@ -137,17 +134,17 @@ - (void)testBarrierLoader GHAssertTrue(loader3.loadingCount == 0, nil); //3. Finish first, check that 2-th was runned - loader1.loaderFinishBlock.didFinishBlock([NSNull new], nil); + loader1.loaderFinishBlock([NSNull new], nil); GHAssertTrue(loader1.finished, nil); GHAssertTrue(loader2.loadingCount == 1, nil); GHAssertTrue(loader3.loadingCount == 0, nil); //4. Finish second and check that 3-th was runned - loader2.loaderFinishBlock.didFinishBlock([NSNull new], nil); + loader2.loaderFinishBlock([NSNull new], nil); GHAssertTrue(loader2.finished == 1, nil); GHAssertTrue(loader3.loadingCount == 1, nil); - loader3.loaderFinishBlock.didFinishBlock([NSNull new], nil); + loader3.loaderFinishBlock([NSNull new], nil); GHAssertTrue(loader3.finished == 1, nil); } diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFileDescriptorReaderTest.m b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFileDescriptorReaderTest.m new file mode 100644 index 0000000..2b3297a --- /dev/null +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/JFileDescriptorReaderTest.m @@ -0,0 +1,74 @@ + +@interface JFileDescriptorReaderTest : GHAsyncTestCase +@end + +@implementation JFileDescriptorReaderTest +{ + NSData *_data; + NSString *_filePath; +} + +- (void)prepareDataFile +{ + if (_data) + return; + + srand(0); + + size_t size = sizeof(int); + + NSMutableData *data = [NSMutableData new]; + + //1000000 + + for (NSUInteger index = 0; index < 10; ++index) { + + int value = rand(); + [data appendBytes:&value length:size]; + } + + _data = [data copy]; + + NSString *fileName = [[NSUUID new] UUIDString]; + _filePath = [NSString cachesPathByAppendingPathComponent:fileName]; + + [_data writeToFile:_filePath atomically:YES]; +} + +- (void)setUp +{ + [self prepareDataFile]; +} + +- (void)testJFileDescriptorReaderDownloadFullFileAndTestContent +{ + NSMutableData *expectedData = [NSMutableData new]; + + void (^block)(JFFSimpleBlock) = ^void(JFFSimpleBlock complete) { + + JFFFileHendlerBuilder handleBuilder = ^uintptr_t() { + + return open([_filePath UTF8String], (O_RDONLY | O_NONBLOCK)); + }; + + JFFAsyncOperation loader = jFileDescriptorReader(handleBuilder, dispatch_get_main_queue()); + + JFFAsyncOperationProgressCallback progressCallback = ^(NSData *chunk) { + + [expectedData appendData:chunk]; + }; + + loader(progressCallback, nil, ^(id result, NSError *error) { + + complete(); + }); + }; + + [self performAsyncRequestOnMainThreadWithBlock:block + selector:_cmd + timeout:10000.]; + + GHAssertEqualObjects(expectedData, _data, nil); +} + +@end diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/ParalelBlockTest.m b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/ParalelBlockTest.m index 9604cf1..1c75b5d 100755 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/ParalelBlockTest.m +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/ParalelBlockTest.m @@ -7,12 +7,12 @@ @interface ParalelBlockTest : GHAsyncTestCase @implementation ParalelBlockTest --(void)setUp +- (void)setUp { [JFFBlockOperation enableInstancesCounting]; } --(void)testParalelTask +- (void)testParalelTask { const NSUInteger initialSchedulerInstancesCount = [JFFBlockOperation instancesCount]; @@ -20,24 +20,25 @@ -(void)testParalelTask __block BOOL theProgressOk = NO; void (^block)(JFFSimpleBlock) = ^(JFFSimpleBlock complete) { + @autoreleasepool { dispatch_queue_t currentQueue = dispatch_get_current_queue(); - JFFSyncOperationWithProgress progressLoadDataBlock_ = ^id(NSError** error, - JFFAsyncOperationProgressHandler progressCallback) - { + JFFSyncOperationWithProgress progressLoadDataBlock = ^id(NSError** error, + JFFAsyncOperationProgressCallback progressCallback) { + if (progressCallback) progressCallback([NSNull null]); return [NSNull null]; }; - JFFAsyncOperation loader = asyncOperationWithSyncOperationWithProgressBlock( progressLoadDataBlock_ ); + JFFAsyncOperation loader = asyncOperationWithSyncOperationWithProgressBlock(progressLoadDataBlock); - JFFDidFinishAsyncOperationHandler doneCallback = ^( id result_, NSError* error_ ) + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { theSameThread = ( currentQueue == dispatch_get_current_queue() ); - if ( result_ && theSameThread ) + if ( result && theSameThread ) { complete(); } @@ -47,7 +48,7 @@ -(void)testParalelTask } }; - JFFAsyncOperationProgressHandler progressCallback = ^(id data) + JFFAsyncOperationProgressCallback progressCallback = ^(id data) { theProgressOk = YES; @@ -85,41 +86,34 @@ - (void)testCancelParalelTask dispatch_queue_t currentQueue = dispatch_get_current_queue(); JFFSyncOperationWithProgress progressLoadDataBlock = ^id(NSError **error, - JFFAsyncOperationProgressHandler progressCallback) - { + JFFAsyncOperationProgressCallback progressCallback) { + progressCallback([ NSNull new]); return [NSNull new]; }; JFFAsyncOperation loader = asyncOperationWithSyncOperationWithProgressBlock(progressLoadDataBlock); - JFFCancelAsyncOperationHandler cancelCallback = ^(BOOL canceled) + JFFAsyncOperationChangeStateCallback stateCallback = ^(JFFAsyncOperationState state) { - theSameThread = ( currentQueue == dispatch_get_current_queue() ); - - if (theSameThread && canceled) - { - complete(); - } - else - { - complete(); - } + complete(); }; - JFFDidFinishAsyncOperationHandler doneCallback = ^(id result, NSError *error) + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { + theSameThread = (currentQueue == dispatch_get_current_queue()); + complete(); }; - JFFAsyncOperationProgressHandler progressCallback = ^(id data) - { + JFFAsyncOperationProgressCallback progressCallback = ^(id data) { + complete(); }; asyncOperationWithDelay(0.1, 0.01)(nil, nil, ^(id result, NSError *error) { loader(progressCallback, - cancelCallback, + stateCallback, doneCallback)(YES); } ); } diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/SequenceOfAsyncOperationsTest.m b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/SequenceOfAsyncOperationsTest.m index d43eb82..4cbc80e 100644 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/SequenceOfAsyncOperationsTest.m +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/SequenceOfAsyncOperationsTest.m @@ -1,6 +1,4 @@ -#import "JFFAsyncOperationManager.h" - -#import +#import #import @interface SequenceOfAsyncOperationsTest : GHTestCase @@ -10,7 +8,7 @@ @implementation SequenceOfAsyncOperationsTest - (void)setUp { - [JFFCancelAsyncOperationBlockHolder enableInstancesCounting]; + [JFFAsyncOperationHandlerBlockHolder enableInstancesCounting]; [JFFDidFinishAsyncOperationBlockHolder enableInstancesCounting]; [JFFAsyncOperationManager enableInstancesCounting]; @@ -34,27 +32,27 @@ - (void)testSequenceOfAsyncOperations __block id sequenceResult = nil; __block BOOL sequenceLoaderFinished = NO; - loader_( nil, nil, ^( id result_, NSError* error_ ) { + loader_(nil, nil, ^(id result_, NSError *error_) { - if ( result_ && !error_ ) { + if (result_ && !error_) { sequenceResult = result_; sequenceLoaderFinished = YES; } - } ); + }); - GHAssertFalse( firstLoader.finished, @"First loader not finished yet" ); - GHAssertFalse( secondLoader.finished, @"Second loader not finished yet" ); - GHAssertFalse( sequenceLoaderFinished, @"Sequence loader not finished yet" ); + GHAssertFalse(firstLoader.finished, @"First loader not finished yet" ); + GHAssertFalse(secondLoader.finished, @"Second loader not finished yet" ); + GHAssertFalse(sequenceLoaderFinished, @"Sequence loader not finished yet" ); - firstLoader.loaderFinishBlock.didFinishBlock( [ NSNull null ], nil ); + firstLoader.loaderFinishBlock([NSNull null], nil); GHAssertTrue( firstLoader.finished, @"First loader finished already" ); GHAssertFalse( secondLoader.finished, @"Second loader not finished yet" ); GHAssertFalse( sequenceLoaderFinished, @"Sequence loader finished already" ); id result = [NSObject new]; - secondLoader.loaderFinishBlock.didFinishBlock( result, nil ); + secondLoader.loaderFinishBlock(result, nil); GHAssertTrue( firstLoader.finished, @"First loader finished already" ); GHAssertTrue( secondLoader.finished, @"Second loader not finished yet" ); @@ -63,7 +61,7 @@ - (void)testSequenceOfAsyncOperations GHAssertTrue( result == sequenceResult, @"Sequence loader finished already" ); } - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } @@ -72,26 +70,26 @@ - (void)testCancelFirstLoaderOfSequence { @autoreleasepool { - JFFAsyncOperationManager* firstLoader = [JFFAsyncOperationManager new]; - JFFAsyncOperationManager* secondLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; JFFAsyncOperation loader = sequenceOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); - JFFCancelAsyncOperation cancel = loader(nil, nil, nil); + JFFAsyncOperationHandler cancel = loader(nil, nil, nil); - GHAssertFalse( firstLoader.canceled, @"still not canceled" ); - GHAssertFalse( secondLoader.canceled, @"still not canceled" ); + GHAssertFalse(firstLoader .canceled, @"still not canceled"); + GHAssertFalse(secondLoader.canceled, @"still not canceled"); - cancel( YES ); + cancel(JFFAsyncOperationHandlerTaskCancel); - GHAssertTrue( firstLoader.canceled, @"canceled" ); - GHAssertTrue( firstLoader.cancelFlag, @"canceled" ); - GHAssertFalse( secondLoader.canceled, @"still not canceled" ); + GHAssertTrue(firstLoader.canceled, @"canceled" ); + GHAssertTrue(firstLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"canceled"); + GHAssertFalse(secondLoader.canceled, @"still not canceled"); } - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } @@ -105,88 +103,85 @@ - (void)testCancelSecondLoaderOfSequence JFFAsyncOperation loader_ = sequenceOfAsyncOperations( firstLoader.loader , secondLoader.loader, nil ); - - JFFCancelAsyncOperation cancel_ = loader_( nil, nil, nil ); - + + JFFAsyncOperationHandler cancel_ = loader_( nil, nil, nil ); + GHAssertFalse( firstLoader.canceled, @"still not canceled" ); GHAssertFalse( secondLoader.canceled, @"still not canceled" ); - firstLoader.loaderFinishBlock.didFinishBlock( [ NSNull null ], nil ); + firstLoader.loaderFinishBlock([NSNull null], nil); GHAssertFalse( firstLoader.canceled, @"still not canceled" ); GHAssertFalse( secondLoader.canceled, @"still not canceled" ); - cancel_( YES ); - - GHAssertFalse( firstLoader.canceled, @"canceled" ); - GHAssertTrue( secondLoader.canceled, @"still not canceled" ); - GHAssertTrue( secondLoader.cancelFlag, @"canceled" ); + cancel_(JFFAsyncOperationHandlerTaskCancel); + GHAssertFalse(firstLoader.canceled, @"canceled" ); + GHAssertTrue(secondLoader.canceled, @"still not canceled" ); + GHAssertTrue(secondLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"canceled" ); } - - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } - (void)testCancelSecondLoaderOfSequenceIfFirstInstantFinish { - @autoreleasepool - { - JFFAsyncOperationManager* first_loader_ = [ JFFAsyncOperationManager new ]; - first_loader_.finishAtLoading = YES; - - JFFAsyncOperationManager* second_loader_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation loader_ = sequenceOfAsyncOperations( first_loader_.loader, second_loader_.loader, nil ); - - JFFCancelAsyncOperation cancel_ = loader_( nil, nil, nil ); - - GHAssertTrue( first_loader_.finished, @"finished" ); - GHAssertFalse( second_loader_.finished, @"not finished" ); - - cancel_( YES ); - - GHAssertFalse( first_loader_.canceled, @"canceled" ); - GHAssertTrue( second_loader_.canceled, @"still not canceled" ); - GHAssertTrue( second_loader_.cancelFlag, @"canceled" ); - - } - - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + @autoreleasepool + { + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + firstLoader.finishAtLoading = YES; + + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; + + JFFAsyncOperation loader = sequenceOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); + + JFFAsyncOperationHandler cancel = loader(nil, nil, nil); + + GHAssertTrue(firstLoader.finished, @"finished" ); + GHAssertFalse(secondLoader.finished, @"not finished" ); + + cancel(JFFAsyncOperationHandlerTaskCancel); + + GHAssertFalse(firstLoader.canceled, @"canceled"); + GHAssertTrue(secondLoader.canceled, @"still not canceled"); + GHAssertTrue(secondLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"canceled"); + } + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } - (void)testFirstLoaderFailOfSequence { - @autoreleasepool - { - JFFAsyncOperationManager* first_loader_ = [ JFFAsyncOperationManager new ]; - first_loader_.failAtLoading = YES; - - JFFAsyncOperationManager* second_loader_ = [ JFFAsyncOperationManager new ]; - second_loader_.finishAtLoading = YES; - - JFFAsyncOperation loader_ = sequenceOfAsyncOperations( first_loader_.loader, second_loader_.loader, nil ); - - __block BOOL sequence_loader_failed_ = NO; - - loader_( nil, nil, ^( id result_, NSError* error_ ) - { - if ( !result_ && error_ ) - { - sequence_loader_failed_ = YES; - } - } ); - - GHAssertTrue( sequence_loader_failed_, @"sequence failed" ); - GHAssertTrue( first_loader_.finished, @"first - finished" ); - GHAssertFalse( second_loader_.finished, @"second - not finished" ); - - } - - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + @autoreleasepool + { + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + firstLoader.failAtLoading = YES; + + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; + secondLoader.finishAtLoading = YES; + + JFFAsyncOperation loader = sequenceOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); + + __block BOOL sequenceLoaderFailed = NO; + + loader(nil, nil, ^(id result, NSError *error) { + + if (!result && error) { + + sequenceLoaderFailed = YES; + } + }); + + GHAssertTrue(sequenceLoaderFailed, @"sequence failed"); + GHAssertTrue(firstLoader.finished, @"first - finished"); + GHAssertFalse(secondLoader.finished, @"second - not finished"); + } + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } @@ -195,29 +190,28 @@ - (void)testSequenceWithOneLoader { @autoreleasepool { - JFFAsyncOperationManager* first_loader_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation loader_ = sequenceOfAsyncOperationsArray( @[ first_loader_.loader ] ); - - __block BOOL sequenceLoaderFinished_ = NO; - - loader_( nil, nil, ^( id result_, NSError* error_ ) - { - if ( result_ && !error_ ) - { - sequenceLoaderFinished_ = YES; + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + + JFFAsyncOperation loader = sequenceOfAsyncOperationsArray(@[firstLoader.loader]); + + __block BOOL sequenceLoaderFinished = NO; + + loader( nil, nil, ^(id result, NSError *error) { + + if (result && !error ) { + + sequenceLoaderFinished = YES; } - } ); - - GHAssertFalse( sequenceLoaderFinished_, @"sequence not finished" ); - - first_loader_.loaderFinishBlock.didFinishBlock( [ NSNull null ], nil ); - - GHAssertTrue( sequenceLoaderFinished_, @"sequence finished" ); - + }); + + GHAssertFalse(sequenceLoaderFinished, @"sequence not finished" ); + + firstLoader.loaderFinishBlock([NSNull null], nil); + + GHAssertTrue(sequenceLoaderFinished, @"sequence finished" ); } - - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } @@ -226,47 +220,47 @@ - (void)testSequenceWithTwoLoader { @autoreleasepool { - JFFAsyncOperationManager* firstLoader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* secondLoader_ = [ JFFAsyncOperationManager new ]; - - NSArray* loaders_ = @[ firstLoader_.loader, secondLoader_.loader ]; - - __block id sequenceResult = nil; - id seconBlockResult = [ NSObject new ]; - - JFFAsyncOperation loader_ = sequenceOfAsyncOperationsArray( loaders_ ); - - __block BOOL sequenceLoaderFinished_ = NO; + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; + + NSArray *loaders = @[firstLoader.loader, secondLoader.loader]; - loader_( nil, nil, ^( id result_, NSError* error_ ) - { - if ( result_ && !error_ ) - { + __block id sequenceResult = nil; + id seconBlockResult = [NSObject new]; + + JFFAsyncOperation loader = sequenceOfAsyncOperationsArray(loaders); + + __block BOOL sequenceLoaderFinished = NO; + + loader(nil, nil, ^(id result_, NSError *error_) { + + if (result_ && !error_) { + sequenceResult = result_; - sequenceLoaderFinished_ = YES; + sequenceLoaderFinished = YES; } - } ); - - GHAssertFalse( sequenceLoaderFinished_, @"sequence not finished" ); - GHAssertFalse( firstLoader_.finished , @"firstLoader not finished" ); - GHAssertFalse( secondLoader_.finished , @"firstLoader not finished" ); + }); + + GHAssertFalse(sequenceLoaderFinished, @"sequence not finished"); + GHAssertFalse(firstLoader.finished , @"firstLoader not finished"); + GHAssertFalse(secondLoader.finished , @"firstLoader not finished"); - firstLoader_.loaderFinishBlock.didFinishBlock( [ NSNull null ], nil ); + firstLoader.loaderFinishBlock([NSNull new], nil); - GHAssertFalse( sequenceLoaderFinished_, @"sequence not finished" ); - GHAssertTrue( firstLoader_.finished , @"firstLoader not finished" ); - GHAssertFalse( secondLoader_.finished , @"secondLoader not finished" ); + GHAssertFalse( sequenceLoaderFinished, @"sequence not finished" ); + GHAssertTrue( firstLoader.finished , @"firstLoader not finished" ); + GHAssertFalse( secondLoader.finished , @"secondLoader not finished" ); - secondLoader_.loaderFinishBlock.didFinishBlock( seconBlockResult, nil ); + secondLoader.loaderFinishBlock( seconBlockResult, nil ); - GHAssertTrue( sequenceLoaderFinished_, @"sequence finished" ); - GHAssertTrue( firstLoader_.finished , @"firstLoader finished" ); - GHAssertTrue( secondLoader_.finished , @"secondLoader finished" ); + GHAssertTrue( sequenceLoaderFinished, @"sequence finished" ); + GHAssertTrue( firstLoader.finished , @"firstLoader finished" ); + GHAssertTrue( secondLoader.finished , @"secondLoader finished" ); GHAssertTrue( seconBlockResult == sequenceResult, @"secondLoader finished" ); } - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } @@ -282,10 +276,10 @@ - (void)testCriticalErrorOnFailFirstLoaderWhenSequenceResultCallbackIsNil loader_( nil, nil, nil ); - firstLoader.loaderFinishBlock.didFinishBlock( nil, [JFFError newErrorWithDescription:@"some error"]); + firstLoader.loaderFinishBlock( nil, [JFFError newErrorWithDescription:@"some error"]); } - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } @@ -302,33 +296,27 @@ - (void)testImmediatelyCancelCallbackOfFirstLoader JFFAsyncOperation loader = sequenceOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); __block BOOL progressCallbackCalled = NO; - JFFAsyncOperationProgressHandler progressCallback = ^(id progressInfo) { + JFFAsyncOperationProgressCallback progressCallback = ^(id progressInfo) { progressCallbackCalled = YES; }; - __block NSNumber *cancelCallbackCallFlag = NO; - JFFCancelAsyncOperationHandler cancelCallback = ^(BOOL canceled) { - - cancelCallbackCallFlag = @(canceled); - }; + __block NSError *finishError; - __block BOOL doneCallbackCalled = NO; - JFFDidFinishAsyncOperationHandler doneCallback = ^(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { - doneCallbackCalled = YES; + finishError = error; }; - loader(progressCallback, cancelCallback, doneCallback); + loader(progressCallback, nil, doneCallback); GHAssertFalse(progressCallbackCalled, @"progressCallback mismatch"); - GHAssertEqualObjects(@YES, cancelCallbackCallFlag, @"cancelCallback mismatch"); - GHAssertFalse(doneCallbackCalled, @"doneCallback mismatch"); + GHAssertTrue([finishError isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]], @"cancelCallback mismatch"); GHAssertEquals((NSUInteger)0, secondLoader.loadingCount, @"unwanted invocation - second loader"); } - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } @@ -345,33 +333,27 @@ - (void)testImmediatelyCancelCallbackOfSecondLoader JFFAsyncOperation loader = sequenceOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); __block BOOL progressCallbackCalled = NO; - JFFAsyncOperationProgressHandler progressCallback = ^(id progressInfo) { + JFFAsyncOperationProgressCallback progressCallback = ^(id progressInfo) { progressCallbackCalled = YES; }; - __block NSNumber *cancelCallbackCallFlag = NO; - JFFCancelAsyncOperationHandler cancelCallback = ^(BOOL canceled) { - - cancelCallbackCallFlag = @(canceled); - }; + __block NSError *finishError; - __block BOOL doneCallbackCalled = NO; - JFFDidFinishAsyncOperationHandler doneCallback = ^(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { - doneCallbackCalled = YES; + finishError = error; }; - loader(progressCallback, cancelCallback, doneCallback); + loader(progressCallback, nil, doneCallback); - firstLoader.loaderFinishBlock.didFinishBlock([NSNull new], nil); + firstLoader.loaderFinishBlock([NSNull new], nil); GHAssertFalse(progressCallbackCalled, nil); - GHAssertEqualObjects(@YES, cancelCallbackCallFlag, nil); - GHAssertFalse(doneCallbackCalled, nil); + GHAssertTrue([finishError isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]], nil); } - GHAssertTrue(0 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"OK"); + GHAssertTrue(0 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"OK"); GHAssertTrue(0 == [JFFAsyncOperationManager instancesCount], @"OK"); } diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/SequenceWithAllResultTest.m b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/SequenceWithAllResultTest.m index 475b40d..7381554 100644 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/SequenceWithAllResultTest.m +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/SequenceWithAllResultTest.m @@ -1,6 +1,4 @@ -#import "JFFAsyncOperationManager.h" - -#import +#import #import @interface SequenceWithAllResultTest : GHTestCase @@ -12,7 +10,7 @@ - (void)setUp { [super setUp]; - [JFFCancelAsyncOperationBlockHolder enableInstancesCounting]; + [JFFAsyncOperationHandlerBlockHolder enableInstancesCounting]; [JFFDidFinishAsyncOperationBlockHolder enableInstancesCounting]; [JFFAsyncOperationManager enableInstancesCounting]; @@ -20,7 +18,7 @@ - (void)setUp - (void)testBlocksAreExecutedInTurn { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; @@ -69,19 +67,19 @@ - (void)testBlocksAreExecutedInTurn GHAssertFalse(thirdLoader.finished , @"Third loader not finished yet"); GHAssertFalse(sequenceLoaderFinished, @"Sequence loader not finished yet"); - firstLoader.loaderFinishBlock.didFinishBlock(firstResult, nil); + firstLoader.loaderFinishBlock(firstResult, nil); GHAssertTrue(firstLoader.finished , @"First loader finished already"); GHAssertFalse(secondLoader.finished , @"Second loader not finished yet"); GHAssertFalse(thirdLoader.finished , @"Third loader not finished yet"); GHAssertFalse(sequenceLoaderFinished, @"Sequence loader finished already"); - secondLoader.loaderFinishBlock.didFinishBlock(secondResult, nil); + secondLoader.loaderFinishBlock(secondResult, nil); GHAssertTrue(firstLoader.finished , @"First loader finished already"); GHAssertTrue(secondLoader.finished , @"Second loader not finished yet"); GHAssertFalse(thirdLoader.finished , @"Third loader not finished yet"); GHAssertFalse(sequenceLoaderFinished, @"Sequence loader finished already"); - thirdLoader.loaderFinishBlock.didFinishBlock(thirdResult, nil); + thirdLoader.loaderFinishBlock(thirdResult, nil); GHAssertTrue(firstLoader.finished , @"First loader finished already"); GHAssertTrue(secondLoader.finished , @"Second loader not finished yet"); GHAssertTrue(thirdLoader.finished , @"Third loader not finished yet"); @@ -99,14 +97,14 @@ - (void)testBlocksAreExecutedInTurn test();//invoke th same loader again } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } - (void)testMultiSequenceWithEmptyArray { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; @@ -119,58 +117,58 @@ - (void)testMultiSequenceWithEmptyArray ); } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } - (void)testMultiSequenceWithOneLoader { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; @autoreleasepool { - JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; - JFFAsyncOperation loader = sequenceOfAsyncOperationsWithAllResults( @[firstLoader.loader] ); + JFFAsyncOperation loader = sequenceOfAsyncOperationsWithAllResults(@[firstLoader.loader]); __block id sequenceResult = nil; __block BOOL sequenceLoaderFinished = NO; - loader( nil, nil, ^(id result, NSError *error_ ) { + loader( nil, nil, ^(id result, NSError *error ) { - if ( result && !error_ ) { + if (result && !error) { sequenceResult = result; sequenceLoaderFinished = YES; } - } ); + }); - NSNumber* firstResult = @(2.71); - GHAssertFalse( firstLoader.finished, @"First loader not finished yet" ); - GHAssertFalse( sequenceLoaderFinished, @"Sequence loader not finished yet" ); + NSNumber *firstResult = @(2.71); + GHAssertFalse(firstLoader.finished, @"First loader not finished yet" ); + GHAssertFalse(sequenceLoaderFinished, @"Sequence loader not finished yet" ); - firstLoader.loaderFinishBlock.didFinishBlock( firstResult, nil ); - GHAssertTrue( firstLoader.finished, @"First loader finished already" ); - GHAssertTrue( sequenceLoaderFinished, @"Sequence loader finished already" ); + firstLoader.loaderFinishBlock(firstResult, nil); + GHAssertTrue(firstLoader.finished, @"First loader finished already" ); + GHAssertTrue(sequenceLoaderFinished, @"Sequence loader finished already" ); - GHAssertTrue( [ sequenceResult isKindOfClass: [ NSArray class ] ], @"Result type mismatch" ); - GHAssertTrue( 1 == [ sequenceResult count ], @"result count mismatch" ); + GHAssertTrue([ sequenceResult isKindOfClass: [ NSArray class ] ], @"Result type mismatch" ); + GHAssertTrue(1 == [ sequenceResult count ], @"result count mismatch" ); - NSArray* expectedResult = @[ firstResult ]; + NSArray *expectedResult = @[firstResult]; GHAssertEqualObjects( expectedResult, sequenceResult, @"result object mismatch" ); } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } - (void)testMultiSequenceFailsIfAnyOperationFails { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; @@ -184,43 +182,44 @@ - (void)testMultiSequenceFailsIfAnyOperationFails JFFAsyncOperationManager *thirdLoader = [JFFAsyncOperationManager new]; thirdLoader.finishAtLoading = YES; - __weak JFFAsyncOperationManager* assign_first_loader_ = firstLoader; - JFFAsyncOperation loader2_ = asyncOperationWithDoneBlock( secondLoader.loader, ^() { + __weak JFFAsyncOperationManager *assignFirstLoader = firstLoader; + JFFAsyncOperation loader2 = asyncOperationWithDoneBlock(secondLoader.loader, ^() { - GHAssertTrue( assign_first_loader_.finished, @"First loader finished already" ); - } ); + GHAssertTrue(assignFirstLoader.finished, @"First loader finished already"); + }); - JFFAsyncOperation loader_ = sequenceOfAsyncOperationsWithAllResults( @[ firstLoader.loader, loader2_, thirdLoader.loader ] ); + JFFAsyncOperation loader = sequenceOfAsyncOperationsWithAllResults(@[firstLoader.loader, loader2, thirdLoader.loader]); __block id sequenceResult = nil; - __block NSError* sequenceError = nil; + __block NSError *sequenceError = nil; __block BOOL sequenceLoaderFinished = NO; - loader_( nil, nil, ^( id result_, NSError* error_ ) { - sequenceError = error_; - sequenceResult = result_; + loader(nil, nil, ^(id result, NSError *error) { + + sequenceError = error; + sequenceResult = result; sequenceLoaderFinished = YES; - } ); + }); - GHAssertFalse( firstLoader.finished, @"First loader not finished yet" ); - GHAssertFalse( secondLoader.finished, @"Second loader not finished yet" ); - GHAssertFalse( thirdLoader.finished, @"Third loader not finished yet" ); - GHAssertFalse( sequenceLoaderFinished, @"Sequence loader not finished yet" ); + GHAssertFalse(firstLoader.finished, @"First loader not finished yet" ); + GHAssertFalse(secondLoader.finished, @"Second loader not finished yet" ); + GHAssertFalse(thirdLoader.finished, @"Third loader not finished yet" ); + GHAssertFalse(sequenceLoaderFinished, @"Sequence loader not finished yet" ); - NSNumber* firstResult = @(2.71); - firstLoader.loaderFinishBlock.didFinishBlock( firstResult, nil ); + NSNumber *firstResult = @(2.71); + firstLoader.loaderFinishBlock(firstResult, nil); - // secondLoader.loaderFinishBlock.didFinishBlock( nil, secondError ); - GHAssertTrue( firstLoader.finished, @"First loader finished already" ); - GHAssertTrue( secondLoader.finished, @"Second loader not finished yet" ); - GHAssertFalse( thirdLoader.finished, @"Third loader not finished yet" ); - GHAssertTrue( sequenceLoaderFinished, @"Sequence loader finished already" ); + // secondLoader.loaderFinishBlock.didFinishBlock(nil, secondError); + GHAssertTrue(firstLoader.finished, @"First loader finished already"); + GHAssertTrue(secondLoader.finished, @"Second loader not finished yet"); + GHAssertFalse(thirdLoader.finished, @"Third loader not finished yet"); + GHAssertTrue(sequenceLoaderFinished, @"Sequence loader finished already"); - GHAssertNil( sequenceResult, @"Result type mismatch" ); - GHAssertNotNil( sequenceError, @"error object mismatch" ); + GHAssertNil(sequenceResult, @"Result type mismatch"); + GHAssertNotNil(sequenceError, @"error object mismatch"); } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/SequenceWithSuccessfullResultTest.m b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/SequenceWithSuccessfullResultTest.m index a181981..ce0d62b 100644 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/SequenceWithSuccessfullResultTest.m +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/SequenceWithSuccessfullResultTest.m @@ -1,9 +1,6 @@ -#import "JFFAsyncOperationManager.h" - -#import +#import #import - @interface SequenceWithSuccessfullResultTest : GHTestCase @end @@ -13,7 +10,7 @@ - (void)setUp { [super setUp]; - [JFFCancelAsyncOperationBlockHolder enableInstancesCounting]; + [JFFAsyncOperationHandlerBlockHolder enableInstancesCounting]; [JFFDidFinishAsyncOperationBlockHolder enableInstancesCounting]; [JFFAsyncOperationManager enableInstancesCounting]; @@ -21,7 +18,7 @@ - (void)setUp - (void)testBlocksAreExecutedInTurn { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; @@ -32,7 +29,7 @@ - (void)testBlocksAreExecutedInTurn JFFAsyncOperationManager *thirdLoader = [JFFAsyncOperationManager new]; __weak JFFAsyncOperationManager *assignFirstLoader = firstLoader; - JFFAsyncOperation loader2 = asyncOperationWithDoneBlock(secondLoader.loader, ^() { + JFFAsyncOperation loader2 = asyncOperationWithDoneBlock(secondLoader.loader, ^void(void) { GHAssertTrue(assignFirstLoader.finished, @"First loader finished already"); }); @@ -51,7 +48,7 @@ - (void)testBlocksAreExecutedInTurn [secondLoader clear]; [thirdLoader clear]; - loader( nil, nil, ^(id result, NSError *error) { + loader(nil, nil, ^(id result, NSError *error) { if (result && !error) { @@ -62,37 +59,36 @@ - (void)testBlocksAreExecutedInTurn NSNumber *firstResult = @(2.71); NSNumber *secondResult = @(3.14); - NSString *thirdResult = @"E and Pi"; + NSString *thirdResult = @"E and Pi"; - GHAssertFalse(firstLoader.finished, @"First loader not finished yet" ); - GHAssertFalse(secondLoader.finished, @"Second loader not finished yet" ); - GHAssertFalse(thirdLoader.finished, @"Third loader not finished yet" ); - GHAssertFalse(sequenceLoaderFinished, @"Sequence loader not finished yet" ); + GHAssertFalse(firstLoader .finished , @"First loader not finished yet" ); + GHAssertFalse(secondLoader.finished , @"Second loader not finished yet" ); + GHAssertFalse(thirdLoader .finished , @"Third loader not finished yet" ); + GHAssertFalse(sequenceLoaderFinished, @"Sequence loader not finished yet"); - firstLoader.loaderFinishBlock.didFinishBlock( firstResult, nil ); - GHAssertTrue(firstLoader.finished, @"First loader finished already" ); - GHAssertFalse(secondLoader.finished, @"Second loader not finished yet" ); - GHAssertFalse(thirdLoader.finished, @"Third loader not finished yet" ); + firstLoader.loaderFinishBlock(firstResult, nil); + GHAssertTrue(firstLoader .finished, @"First loader finished already" ); + GHAssertFalse(secondLoader.finished, @"Second loader not finished yet"); + GHAssertFalse(thirdLoader .finished, @"Third loader not finished yet" ); GHAssertFalse(sequenceLoaderFinished, @"Sequence loader finished already"); - secondLoader.loaderFinishBlock.didFinishBlock( secondResult, nil ); + secondLoader.loaderFinishBlock(secondResult, nil); GHAssertTrue(firstLoader.finished, @"First loader finished already" ); GHAssertTrue(secondLoader.finished, @"Second loader not finished yet" ); GHAssertFalse(thirdLoader.finished, @"Third loader not finished yet" ); GHAssertFalse(sequenceLoaderFinished, @"Sequence loader finished already" ); - thirdLoader.loaderFinishBlock.didFinishBlock( thirdResult, nil ); - GHAssertTrue( firstLoader.finished, @"First loader finished already" ); - GHAssertTrue( secondLoader.finished, @"Second loader not finished yet" ); - GHAssertTrue( thirdLoader.finished, @"Third loader not finished yet" ); - GHAssertTrue( sequenceLoaderFinished, @"Sequence loader finished already" ); - + thirdLoader.loaderFinishBlock(thirdResult, nil); + GHAssertTrue(firstLoader.finished , @"First loader finished already" ); + GHAssertTrue(secondLoader.finished, @"Second loader not finished yet"); + GHAssertTrue(thirdLoader.finished , @"Third loader not finished yet" ); + GHAssertTrue(sequenceLoaderFinished, @"Sequence loader finished already"); - GHAssertTrue( [ sequenceResult isKindOfClass: [ NSArray class ] ], @"Result type mismatch" ); - GHAssertTrue( 3 == [ sequenceResult count ], @"result count mismatch" ); + GHAssertTrue([sequenceResult isKindOfClass:[NSArray class]], @"Result type mismatch"); + GHAssertTrue(3 == [sequenceResult count], @"result count mismatch"); - NSArray* expectedResult = @[ firstResult, secondResult, thirdResult ]; - GHAssertEqualObjects( expectedResult, sequenceResult, @"result object mismatch" ); + NSArray *expectedResult = @[firstResult, secondResult, thirdResult]; + GHAssertEqualObjects(expectedResult, sequenceResult, @"result object mismatch"); }; test(); @@ -100,14 +96,14 @@ - (void)testBlocksAreExecutedInTurn test();//invoke th same loader again } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } - (void)testMultiSequenceWithEmptyArray { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; @@ -115,19 +111,19 @@ - (void)testMultiSequenceWithEmptyArray { GHAssertThrows ( - sequenceOfAsyncOperationsWithSuccessfullResults( @[] ), + sequenceOfAsyncOperationsWithSuccessfullResults(@[]), @"asert expected" ); } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } - (void)testMultiSequenceWithOneLoader { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; @@ -150,28 +146,28 @@ - (void)testMultiSequenceWithOneLoader }); NSNumber* firstResult = @(2.71); - GHAssertFalse( firstLoader.finished, @"First loader not finished yet" ); - GHAssertFalse( sequenceLoaderFinished, @"Sequence loader not finished yet" ); + GHAssertFalse(firstLoader.finished, @"First loader not finished yet"); + GHAssertFalse(sequenceLoaderFinished, @"Sequence loader not finished yet"); - firstLoader.loaderFinishBlock.didFinishBlock( firstResult, nil ); - GHAssertTrue( firstLoader.finished, @"First loader finished already" ); - GHAssertTrue( sequenceLoaderFinished, @"Sequence loader finished already" ); + firstLoader.loaderFinishBlock(firstResult, nil); + GHAssertTrue(firstLoader.finished, @"First loader finished already"); + GHAssertTrue(sequenceLoaderFinished, @"Sequence loader finished already"); - GHAssertTrue( [ sequenceResult isKindOfClass: [ NSArray class ] ], @"Result type mismatch" ); - GHAssertTrue( 1 == [ sequenceResult count ], @"result count mismatch" ); + GHAssertTrue([sequenceResult isKindOfClass:[NSArray class]], @"Result type mismatch"); + GHAssertTrue(1 == [sequenceResult count], @"result count mismatch"); - NSArray* expectedResult = @[ firstResult ]; - GHAssertEqualObjects( expectedResult, sequenceResult, @"result object mismatch" ); + NSArray* expectedResult = @[firstResult]; + GHAssertEqualObjects(expectedResult, sequenceResult, @"result object mismatch"); } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } - (void)testFailedOperationResultsAreSkippedInMultiSequence { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; @@ -210,7 +206,7 @@ - (void)testFailedOperationResultsAreSkippedInMultiSequence NSNumber *firstResult = @(2.71); NSNull *thirdResult = [NSNull null]; - firstLoader.loaderFinishBlock.didFinishBlock(firstResult, nil); + firstLoader.loaderFinishBlock(firstResult, nil); // secondLoader.loaderFinishBlock.didFinishBlock( nil, secondError ); GHAssertTrue(firstLoader.finished , @"First loader finished already" ); @@ -221,14 +217,14 @@ - (void)testFailedOperationResultsAreSkippedInMultiSequence GHAssertNotNil(sequenceResult, @"Result type mismatch" ); GHAssertNil(sequenceError, @"error object mismatch" ); - GHAssertTrue([ sequenceResult isKindOfClass: [ NSArray class ] ], @"Result type mismatch" ); - GHAssertTrue(2 == [ sequenceResult count ], @"result count mismatch" ); + GHAssertTrue([sequenceResult isKindOfClass:[NSArray class]], @"Result type mismatch"); + GHAssertTrue(2 == [sequenceResult count], @"result count mismatch" ); - NSArray* expectedResult = @[ firstResult, thirdResult ]; - GHAssertEqualObjects( expectedResult, sequenceResult, @"result object mismatch" ); + NSArray* expectedResult = @[firstResult, thirdResult]; + GHAssertEqualObjects(expectedResult, sequenceResult, @"result object mismatch"); } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/TrySequenceOfAsyncOperationsTest.m b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/TrySequenceOfAsyncOperationsTest.m index 4760f0b..4ca3994 100644 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/TrySequenceOfAsyncOperationsTest.m +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/TrySequenceOfAsyncOperationsTest.m @@ -1,6 +1,4 @@ -#import "JFFAsyncOperationManager.h" - -#import +#import #import @interface TrySequenceOfAsyncOperationsTest : GHTestCase @@ -10,7 +8,7 @@ @implementation TrySequenceOfAsyncOperationsTest -(void)setUp { - [JFFCancelAsyncOperationBlockHolder enableInstancesCounting]; + [JFFAsyncOperationHandlerBlockHolder enableInstancesCounting]; [JFFDidFinishAsyncOperationBlockHolder enableInstancesCounting]; [JFFAsyncOperationManager enableInstancesCounting]; @@ -18,7 +16,7 @@ -(void)setUp -(void)testTrySequenceOfAsyncOperations { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; @@ -45,18 +43,18 @@ -(void)testTrySequenceOfAsyncOperations } } ); - GHAssertFalse( firstLoader.finished, @"First loader not finished yet" ); - GHAssertFalse( secondLoader.finished, @"Second loader not finished yet" ); - GHAssertFalse( sequenceLoaderFinished_, @"Sequence loader not finished yet" ); + GHAssertFalse(firstLoader.finished, @"First loader not finished yet" ); + GHAssertFalse(secondLoader.finished, @"Second loader not finished yet" ); + GHAssertFalse(sequenceLoaderFinished_, @"Sequence loader not finished yet" ); - firstLoader.loaderFinishBlock.didFinishBlock( nil, [ JFFError newErrorWithDescription: @"some error" ] ); + firstLoader.loaderFinishBlock(nil, [JFFError newErrorWithDescription:@"some error"]); GHAssertTrue( firstLoader.finished, @"First loader finished already" ); GHAssertFalse( secondLoader.finished, @"Second loader not finished yet" ); GHAssertFalse( sequenceLoaderFinished_, @"Sequence loader finished already" ); id result_ = [NSObject new]; - secondLoader.loaderFinishBlock.didFinishBlock( result_, nil ); + secondLoader.loaderFinishBlock(result_, nil); GHAssertTrue( firstLoader.finished, @"First loader finished already" ); GHAssertTrue( secondLoader.finished, @"Second loader not finished yet" ); @@ -65,151 +63,148 @@ -(void)testTrySequenceOfAsyncOperations GHAssertTrue( result_ == sequenceResult_, @"Sequence loader finished already" ); } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } --(void)testCancelFirstLoaderOfTrySequence +- (void)testCancelFirstLoaderOfTrySequence { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; @autoreleasepool { - JFFAsyncOperationManager* firstLoader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* secondLoader_ = [ JFFAsyncOperationManager new ]; + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; - JFFAsyncOperation loader_ = trySequenceOfAsyncOperations( firstLoader_.loader - , secondLoader_.loader - , nil ); + JFFAsyncOperation loader = trySequenceOfAsyncOperations(firstLoader.loader, + secondLoader.loader, + nil); - JFFCancelAsyncOperation cancel_ = loader_( nil, nil, nil ); + JFFAsyncOperationHandler handler = loader(nil, nil, nil); - GHAssertFalse( firstLoader_.canceled, @"still not canceled" ); - GHAssertFalse( secondLoader_.canceled, @"still not canceled" ); + GHAssertFalse(firstLoader .canceled, @"still not canceled" ); + GHAssertFalse(secondLoader.canceled, @"still not canceled" ); - cancel_( YES ); + handler(JFFAsyncOperationHandlerTaskCancel); - GHAssertTrue( firstLoader_.canceled , @"canceled" ); - GHAssertTrue( firstLoader_.cancelFlag, @"canceled" ); - GHAssertFalse( secondLoader_.canceled, @"still not canceled" ); + GHAssertTrue(firstLoader.canceled , @"canceled" ); + GHAssertTrue(firstLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"canceled" ); + GHAssertFalse( secondLoader.canceled, @"still not canceled" ); } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } --(void)testCancelSecondLoaderOfTrySequence +- (void)testCancelSecondLoaderOfTrySequence { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; @autoreleasepool { - JFFAsyncOperationManager* firstLoader_ = [ JFFAsyncOperationManager new ]; - JFFAsyncOperationManager* secondLoader_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation loader_ = trySequenceOfAsyncOperations( firstLoader_.loader, secondLoader_.loader, nil ); - - JFFCancelAsyncOperation cancel_ = loader_( nil, nil, nil ); - - GHAssertFalse( firstLoader_.canceled, @"still not canceled" ); - GHAssertFalse( secondLoader_.canceled, @"still not canceled" ); - - firstLoader_.loaderFinishBlock.didFinishBlock( nil, [ JFFError newErrorWithDescription: @"some error" ] ); - - GHAssertFalse( firstLoader_.canceled, @"still not canceled" ); - GHAssertFalse( secondLoader_.canceled, @"still not canceled" ); - - cancel_( YES ); - - GHAssertFalse( firstLoader_.canceled, @"canceled" ); - GHAssertTrue( secondLoader_.canceled, @"still not canceled" ); - GHAssertTrue( secondLoader_.cancelFlag, @"canceled" ); - + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; + + JFFAsyncOperation loader = trySequenceOfAsyncOperations( firstLoader.loader, secondLoader.loader, nil ); + + JFFAsyncOperationHandler handler = loader(nil, nil, nil); + + GHAssertFalse(firstLoader.canceled, @"still not canceled" ); + GHAssertFalse(secondLoader.canceled, @"still not canceled" ); + + firstLoader.loaderFinishBlock(nil, [JFFError newErrorWithDescription:@"some error"]); + + GHAssertFalse(firstLoader.canceled, @"still not canceled"); + GHAssertFalse(secondLoader.canceled, @"still not canceled"); + + handler(JFFAsyncOperationHandlerTaskCancel); + + GHAssertFalse(firstLoader.canceled, @"canceled"); + GHAssertTrue(secondLoader.canceled, @"still not canceled"); + GHAssertTrue(secondLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"canceled"); } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } --(void)testCancelSecondLoaderOfTrySequenceIfFirstInstantFinish +- (void)testCancelSecondLoaderOfTrySequenceIfFirstInstantFinish { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; @autoreleasepool { - JFFAsyncOperationManager* first_loader_ = [ JFFAsyncOperationManager new ]; - first_loader_.failAtLoading = YES; - - JFFAsyncOperationManager* second_loader_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation loader_ = trySequenceOfAsyncOperations( first_loader_.loader, second_loader_.loader, nil ); - - JFFCancelAsyncOperation cancel_ = loader_( nil, nil, nil ); - - GHAssertTrue( first_loader_.finished, @"finished" ); - GHAssertFalse( second_loader_.finished, @"not finished" ); - - cancel_( YES ); - - GHAssertFalse( first_loader_.canceled, @"canceled" ); - GHAssertTrue( second_loader_.canceled, @"still not canceled" ); - GHAssertTrue( second_loader_.cancelFlag, @"canceled" ); - + JFFAsyncOperationManager* firstLoader = [ JFFAsyncOperationManager new ]; + firstLoader.failAtLoading = YES; + + JFFAsyncOperationManager* secondLoader = [ JFFAsyncOperationManager new ]; + + JFFAsyncOperation loader_ = trySequenceOfAsyncOperations( firstLoader.loader, secondLoader.loader, nil ); + + JFFAsyncOperationHandler handler = loader_( nil, nil, nil ); + + GHAssertTrue( firstLoader.finished, @"finished" ); + GHAssertFalse( secondLoader.finished, @"not finished" ); + + handler(JFFAsyncOperationHandlerTaskCancel); + + GHAssertFalse(firstLoader.canceled, @"canceled" ); + GHAssertTrue(secondLoader.canceled, @"still not canceled" ); + GHAssertTrue(secondLoader.lastHandleFlag == JFFAsyncOperationHandlerTaskCancel, @"canceled" ); } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } --(void)testFirstLoaderOkOfTrySequence +- (void)testFirstLoaderOkOfTrySequence { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; @autoreleasepool { - JFFAsyncOperationManager* first_loader_ = [ JFFAsyncOperationManager new ]; - first_loader_.finishAtLoading = YES; - - JFFAsyncOperationManager* second_loader_ = [ JFFAsyncOperationManager new ]; - - JFFAsyncOperation loader_ = trySequenceOfAsyncOperations( first_loader_.loader, second_loader_.loader, nil ); - - __block BOOL sequence_loader_finished_ = NO; - - loader_( nil, nil, ^( id result_, NSError* error_ ) - { - if ( result_ && !error_ ) - { - sequence_loader_finished_ = YES; + JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; + firstLoader.finishAtLoading = YES; + + JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; + + JFFAsyncOperation loader = trySequenceOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); + + __block BOOL sequenceLoaderFinished = NO; + + loader(nil, nil, ^(id result, NSError *error) { + + if (result && !error) { + + sequenceLoaderFinished = YES; } - } ); - - GHAssertTrue( sequence_loader_finished_, @"sequence failed" ); - GHAssertTrue( first_loader_.finished, @"first - finished" ); - GHAssertFalse( second_loader_.finished, @"second - not finished" ); + }); + GHAssertTrue(sequenceLoaderFinished, @"sequence failed" ); + GHAssertTrue(firstLoader.finished, @"first - finished" ); + GHAssertFalse(secondLoader.finished, @"second - not finished" ); } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } --(void)testTrySequenceWithOneLoader +- (void)testTrySequenceWithOneLoader { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; @@ -229,44 +224,53 @@ -(void)testTrySequenceWithOneLoader } }); - GHAssertFalse( sequenceLoaderFinished, @"sequence not finished" ); + GHAssertFalse(sequenceLoaderFinished, @"sequence not finished"); - firstLoader.loaderFinishBlock.didFinishBlock([NSNull new], nil); + firstLoader.loaderFinishBlock([NSNull new], nil); - GHAssertTrue( sequenceLoaderFinished, @"sequence finished" ); + GHAssertTrue(sequenceLoaderFinished, @"sequence finished"); } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } - (void)testCriticalErrorOnFailFirstLoaderWhenTrySequenceResultCallbackIsNil { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; + __weak JFFAsyncOperationManager *weakFirstLoader; + __weak JFFAsyncOperationManager *weakSecondLoader; + @autoreleasepool { JFFAsyncOperationManager *firstLoader = [JFFAsyncOperationManager new]; JFFAsyncOperationManager *secondLoader = [JFFAsyncOperationManager new]; + weakFirstLoader = firstLoader; + weakSecondLoader = secondLoader; + JFFAsyncOperation loader = trySequenceOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); loader(nil, nil, nil); - firstLoader.loaderFinishBlock.didFinishBlock( [ NSNull null ], nil ); + firstLoader.loaderFinishBlock([NSNull null], nil); } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertNil(weakFirstLoader , nil); + GHAssertNil(weakSecondLoader, nil); + + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } - (void)testImmediatelyCancelCallbackOfFirstLoader { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; @@ -280,40 +284,34 @@ - (void)testImmediatelyCancelCallbackOfFirstLoader JFFAsyncOperation loader = trySequenceOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); __block BOOL progressCallbackCalled = NO; - JFFAsyncOperationProgressHandler progressCallback = ^(id progressInfo) { + JFFAsyncOperationProgressCallback progressCallback = ^(id progressInfo) { progressCallbackCalled = YES; }; - __block NSNumber *cancelCallbackCallFlag = NO; - JFFCancelAsyncOperationHandler cancelCallback = ^(BOOL canceled) { - - cancelCallbackCallFlag = @(canceled); - }; + __block NSError *finishError; - __block BOOL doneCallbackCalled = NO; - JFFDidFinishAsyncOperationHandler doneCallback = ^(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { - doneCallbackCalled = YES; + finishError = error; }; - loader(progressCallback, cancelCallback, doneCallback); + loader(progressCallback, nil, doneCallback); GHAssertFalse(progressCallbackCalled, nil); - GHAssertEqualObjects(@YES, cancelCallbackCallFlag, nil); - GHAssertFalse(doneCallbackCalled, nil); + GHAssertTrue([finishError isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]], nil); GHAssertEquals((NSUInteger)0, secondLoader.loadingCount, nil); } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } - (void)testImmediatelyCancelCallbackOfSecondLoader { - NSUInteger originalInstanceCount1 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount1 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount2 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationManager instancesCount]; @@ -327,33 +325,27 @@ - (void)testImmediatelyCancelCallbackOfSecondLoader JFFAsyncOperation loader = trySequenceOfAsyncOperations(firstLoader.loader, secondLoader.loader, nil); __block BOOL progressCallbackCalled = NO; - JFFAsyncOperationProgressHandler progressCallback = ^(id progressInfo) { + JFFAsyncOperationProgressCallback progressCallback = ^(id progressInfo) { progressCallbackCalled = YES; }; - __block NSNumber *cancelCallbackCallFlag = NO; - JFFCancelAsyncOperationHandler cancelCallback = ^(BOOL canceled) { - - cancelCallbackCallFlag = @(canceled); - }; + __block NSError *finishError; - __block BOOL doneCallbackCalled = NO; - JFFDidFinishAsyncOperationHandler doneCallback = ^(id result, NSError *error) { + JFFDidFinishAsyncOperationCallback doneCallback = ^(id result, NSError *error) { - doneCallbackCalled = YES; + finishError = error; }; - loader(progressCallback, cancelCallback, doneCallback); + loader(progressCallback, nil, doneCallback); - firstLoader.loaderFinishBlock.didFinishBlock(nil, [JFFError newErrorWithDescription:@"test"]); + firstLoader.loaderFinishBlock(nil, [JFFError newErrorWithDescription:@"test"]); GHAssertFalse(progressCallbackCalled, nil); - GHAssertEqualObjects(@YES, cancelCallbackCallFlag, nil); - GHAssertFalse(doneCallbackCalled, nil); + GHAssertTrue([finishError isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]], nil); } - GHAssertTrue(originalInstanceCount1 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount1 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount2 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationManager instancesCount], @"All object of this class should be deallocated"); } diff --git a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/WeakAsyncOperationTest.m b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/WeakAsyncOperationTest.m index a52e8b5..ce71c59 100644 --- a/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/WeakAsyncOperationTest.m +++ b/test/JFFAsyncOperationsTest/JFFAsyncOperationsTest/WeakAsyncOperationTest.m @@ -1,5 +1,5 @@ #import -#import +#import #import #import @@ -11,7 +11,7 @@ @implementation WeakAsyncOperationTest - (void)setUp { [JFFSimpleBlockHolder enableInstancesCounting]; - [JFFCancelAsyncOperationBlockHolder enableInstancesCounting]; + [JFFAsyncOperationHandlerBlockHolder enableInstancesCounting]; [JFFAsyncOperationProgressBlockHolder enableInstancesCounting]; [JFFDidFinishAsyncOperationBlockHolder enableInstancesCounting]; } @@ -19,51 +19,52 @@ - (void)setUp - (void)testCancelActionAfterUnsubscribeOnDealloc { NSUInteger originalInstanceCount1 = [JFFSimpleBlockHolder instancesCount]; - NSUInteger originalInstanceCount2 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount2 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationProgressBlockHolder instancesCount]; NSUInteger originalInstanceCount4 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; @autoreleasepool { - __block BOOL cancelCallbackCalled_ = NO; - JFFCancelAsyncOperation cancel_; + __block JFFAsyncOperationHandlerTask cancelCallbackCalled = JFFAsyncOperationHandlerTaskUndefined; + JFFAsyncOperationHandler cancel; @autoreleasepool { - NSObject* obj_ = [ NSObject new ]; - + NSObject *obj = [NSObject new]; + @autoreleasepool { - JFFAsyncOperation operation_ = ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) + JFFAsyncOperation operation = ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { - cancelCallback = [ cancelCallback copy ]; - return [ ^void( BOOL cancel_ ) - { - if ( cancelCallback ) - cancelCallback( cancel_ ); - } copy ]; + stateCallback = [stateCallback copy]; + doneCallback = [doneCallback copy]; + + return ^void(JFFAsyncOperationHandlerTask task) { + + processHandlerFlag(task, stateCallback, doneCallback); + }; }; - operation_ = [ obj_ autoUnsubsribeOnDeallocAsyncOperation: operation_ ]; + operation = [obj autoUnsubsribeOnDeallocAsyncOperation:operation]; - cancel_ = operation_( nil, ^( BOOL canceled_ ) - { - cancelCallbackCalled_ = YES; - }, nil ); + cancel = operation(nil, ^(JFFAsyncOperationState state) { + + cancelCallbackCalled = YES; + }, nil); } } - GHAssertTrue( cancelCallbackCalled_, @"Cancel callback should be called" ); - cancelCallbackCalled_ = NO; + GHAssertTrue(cancelCallbackCalled, @"Cancel callback should be called"); + cancelCallbackCalled = NO; - cancel_( YES ); + cancel(JFFAsyncOperationHandlerTaskCancel); - GHAssertFalse( cancelCallbackCalled_, @"Cancel callback should not be called after dealloc" ); + GHAssertFalse(cancelCallbackCalled, @"Cancel callback should not be called after dealloc"); } GHAssertTrue(originalInstanceCount1 == [JFFSimpleBlockHolder instancesCount], @"All object of this class should be deallocated"); - GHAssertTrue(originalInstanceCount2 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount2 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationProgressBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount4 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); } @@ -71,29 +72,30 @@ - (void)testCancelActionAfterUnsubscribeOnDealloc - (void)testOnceCancelBlockCallingOnDealloc { NSUInteger originalInstanceCount1 = [JFFSimpleBlockHolder instancesCount]; - NSUInteger originalInstanceCount2 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount2 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationProgressBlockHolder instancesCount]; NSUInteger originalInstanceCount4 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; @autoreleasepool { __block NSUInteger cancelCallbackCallCount = 0; - + @autoreleasepool { NSObject *obj = [NSObject new]; - - JFFAsyncOperation operation = ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) + + JFFAsyncOperation operation = ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { - cancelCallback = [cancelCallback copy]; - return [ ^void( BOOL cancel_ ) - { + stateCallback = [stateCallback copy]; + doneCallback = [doneCallback copy]; + + return ^void(JFFAsyncOperationHandlerTask task) { + ++cancelCallbackCallCount; - if (cancelCallback) - cancelCallback( cancel_ ); - } copy ]; + processHandlerFlag(task, stateCallback, doneCallback); + }; }; operation = [obj autoUnsubsribeOnDeallocAsyncOperation:operation]; @@ -105,7 +107,7 @@ - (void)testOnceCancelBlockCallingOnDealloc } GHAssertTrue(originalInstanceCount1 == [JFFSimpleBlockHolder instancesCount], @"All object of this class should be deallocated"); - GHAssertTrue(originalInstanceCount2 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount2 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationProgressBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount4 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); } @@ -113,7 +115,7 @@ - (void)testOnceCancelBlockCallingOnDealloc - (void)testCancelCallbackCallingOnCancelBlock { NSUInteger originalInstanceCount1 = [JFFSimpleBlockHolder instancesCount]; - NSUInteger originalInstanceCount2 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount2 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationProgressBlockHolder instancesCount]; NSUInteger originalInstanceCount4 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; @@ -122,187 +124,181 @@ - (void)testCancelCallbackCallingOnCancelBlock __block BOOL cancelBlockCalled = NO; - JFFAsyncOperation operation = ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { - cancelCallback = [cancelCallback copy]; - return [^void(BOOL cancel) { - cancelBlockCalled = cancel; - if (cancelCallback) - cancelCallback(cancel); - }copy]; + JFFAsyncOperation operation = ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { + stateCallback = [stateCallback copy]; + doneCallback = [doneCallback copy]; + + return ^void(JFFAsyncOperationHandlerTask task) { + + cancelBlockCalled = (task == JFFAsyncOperationHandlerTaskCancel); + processHandlerFlag(task, stateCallback, doneCallback); + }; }; operation = [obj autoUnsubsribeOnDeallocAsyncOperation:operation]; __block BOOL cancelCallbackCalled = NO; - JFFCancelAsyncOperation cancel = operation(nil, ^(BOOL canceled) { - cancelCallbackCalled = YES; - }, nil); + JFFAsyncOperationHandler cancel = operation(nil, nil, ^(id result, NSError *error) { + + cancelCallbackCalled = [error isKindOfClass:[JFFAsyncOpFinishedByCancellationError class]]; + }); - cancel(YES); + cancel(JFFAsyncOperationHandlerTaskCancel); GHAssertTrue(cancelCallbackCalled, @"Cancel callback should not be called after dealloc"); GHAssertTrue(cancelBlockCalled, @"Cancel callback should not be called after dealloc"); } GHAssertTrue(originalInstanceCount1 == [JFFSimpleBlockHolder instancesCount], @"All object of this class should be deallocated"); - GHAssertTrue(originalInstanceCount2 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount2 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationProgressBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount4 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); } // When unsubscribe from autoCancelAsyncOperation -> native should not be canceled --(void)testUnsubscribeFromAutoCancel +- (void)testUnsubscribeFromAutoCancel { NSUInteger originalInstanceCount1 = [JFFSimpleBlockHolder instancesCount]; - NSUInteger originalInstanceCount2 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount2 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationProgressBlockHolder instancesCount]; NSUInteger originalInstanceCount4 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; @autoreleasepool { - NSObject *operationOwner_ = [ NSObject new ]; - - __block BOOL nativeCancelBlockCalled_ = NO; - - JFFAsyncOperation operation_ = ^JFFCancelAsyncOperation( JFFAsyncOperationProgressHandler progressCallback_ - , JFFCancelAsyncOperationHandler cancelCallback_ - , JFFDidFinishAsyncOperationHandler doneCallback_ ) - { - cancelCallback_ = [ cancelCallback_ copy ]; - return [ ^void( BOOL cancel_ ) - { - nativeCancelBlockCalled_ = YES; - if ( cancelCallback_ ) - cancelCallback_( cancel_ ); - } copy ]; + NSObject *operationOwner = [NSObject new]; + + __block BOOL nativeCancelBlockCalled = NO; + + JFFAsyncOperation operation = ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { + + stateCallback = [stateCallback copy]; + doneCallback = [doneCallback copy]; + + return ^void(JFFAsyncOperationHandlerTask task) { + + nativeCancelBlockCalled = (task == JFFAsyncOperationHandlerTaskUnsubscribe); + processHandlerFlag(task, stateCallback, doneCallback); + }; }; - - JFFAsyncOperation autoCancelOperation_ = [ operationOwner_ autoCancelOnDeallocAsyncOperation: operation_ ]; - - __block BOOL deallocated_ = NO; - JFFCancelAsyncOperation cancel_; - __block BOOL cancelCallbackCalled_ = NO; - + + JFFAsyncOperation autoCancelOperation = [operationOwner autoCancelOnDeallocAsyncOperation:operation]; + + __block BOOL deallocated = NO; + JFFAsyncOperationHandler cancel; + __block BOOL cancelCallbackCalled = NO; + @autoreleasepool { - NSObject* ownedByCallbacks_ = [ NSObject new ]; - [ ownedByCallbacks_ addOnDeallocBlock: ^void( void ) - { - deallocated_ = YES; - } ]; - - JFFAsyncOperationProgressHandler progress_callback_ = ^void( id progressInfo_ ) - { - //simulate using object in callback block - [ ownedByCallbacks_ class ]; - }; - JFFCancelAsyncOperationHandler cancel_callback_ = ^void( BOOL canceled_ ) + NSObject *ownedByCallbacks = [NSObject new]; + [ownedByCallbacks addOnDeallocBlock:^void(void) { + + deallocated = YES; + }]; + + JFFAsyncOperationProgressCallback progressCallback = ^void(id progressInfo) { - cancelCallbackCalled_ = !canceled_; //simulate using object in callback block - [ ownedByCallbacks_ class ]; + [ownedByCallbacks class]; }; - JFFDidFinishAsyncOperationHandler done_callback_ = ^void( id result_, NSError* error_ ) - { + JFFDidFinishAsyncOperationCallback doneCallback = ^void(id result, NSError *error) { + + cancelCallbackCalled = [error isKindOfClass:[JFFAsyncOpFinishedByUnsubscriptionError class]]; //simulate using object in callback block - [ ownedByCallbacks_ class ]; + [ownedByCallbacks class]; }; - - cancel_ = autoCancelOperation_( progress_callback_ - , cancel_callback_ - , done_callback_ ); + + cancel = autoCancelOperation(progressCallback, nil, doneCallback); } - - GHAssertFalse( deallocated_, @"owned_by_callbacks_ object should not be deallocated" ); - - cancel_( NO ); - - GHAssertTrue( nativeCancelBlockCalled_, @"Native cancel block should not be called" ); - GHAssertTrue( deallocated_, @"owned_by_callbacks_ objet should be deallocated" ); - GHAssertTrue( cancelCallbackCalled_, @"cancel callback should ba called" ); + + GHAssertFalse(deallocated, @"owned_by_callbacks_ object should not be deallocated" ); + + cancel(JFFAsyncOperationHandlerTaskUnsubscribe); + + GHAssertTrue(nativeCancelBlockCalled, @"Native cancel block should not be called" ); + GHAssertTrue(deallocated, @"owned_by_callbacks_ objet should be deallocated" ); + GHAssertTrue(cancelCallbackCalled, @"cancel callback should ba called" ); } GHAssertTrue(originalInstanceCount1 == [JFFSimpleBlockHolder instancesCount], @"All object of this class should be deallocated"); - GHAssertTrue(originalInstanceCount2 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount2 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationProgressBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount4 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); } --(void)testCancelCallbackCallingForNativeLoaderWhenWeekDelegateRemove +- (void)testCancelCallbackCallingForNativeLoaderWhenWeekDelegateRemove { NSUInteger originalInstanceCount1 = [JFFSimpleBlockHolder instancesCount]; - NSUInteger originalInstanceCount2 = [JFFCancelAsyncOperationBlockHolder instancesCount]; + NSUInteger originalInstanceCount2 = [JFFAsyncOperationHandlerBlockHolder instancesCount]; NSUInteger originalInstanceCount3 = [JFFAsyncOperationProgressBlockHolder instancesCount]; NSUInteger originalInstanceCount4 = [JFFDidFinishAsyncOperationBlockHolder instancesCount]; @autoreleasepool { - __block BOOL nativeCancelBlockCalled_ = NO; - + __block BOOL nativeCancelBlockCalled = NO; + @autoreleasepool { - NSObject* operationOwner_ = [ NSObject new ]; - - __block BOOL unsibscribeCancelBlockCalled_ = NO; - __block BOOL delegateDeallocated_ = NO; - + NSObject *operationOwner = [NSObject new]; + + __block BOOL unsibscribeCancelBlockCalled = NO; + __block BOOL delegateDeallocated = NO; + @autoreleasepool { - NSObject* delegate_ = [ NSObject new ]; - [ delegate_ addOnDeallocBlock: ^void( void ) - { - delegateDeallocated_ = YES; - } ]; - + NSObject *delegate = [NSObject new]; + [delegate addOnDeallocBlock:^void(void) { + + delegateDeallocated = YES; + }]; + JFFAsyncOperation operation_ = nil; - + @autoreleasepool { - operation_ = [ ^JFFCancelAsyncOperation( JFFAsyncOperationProgressHandler progressCallback_ - , JFFCancelAsyncOperationHandler cancelCallback_ - , JFFDidFinishAsyncOperationHandler doneCallback_ ) - { - return [ ^void( BOOL cancel_ ) - { - if ( cancelCallback_ ) - cancelCallback_( cancel_ ); - nativeCancelBlockCalled_ = YES; - } copy ]; - } copy ]; + operation_ = [^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback stateCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { + + stateCallback = [stateCallback copy]; + doneCallback = [doneCallback copy]; + + return ^void(JFFAsyncOperationHandlerTask task) { + + nativeCancelBlockCalled = (task == JFFAsyncOperationHandlerTaskUnsubscribe); + processHandlerFlag(task, stateCallback, doneCallback); + }; + } copy]; //like native operation still living - - JFFAsyncOperation autoCancelOperation_ = [ operationOwner_ autoCancelOnDeallocAsyncOperation: operation_ ]; - - __unsafe_unretained id weakDelegate_ = delegate_; - - JFFCancelAsyncOperationHandler unsubscribeCallback_ = ^( BOOL canceled_ ) - { - unsibscribeCancelBlockCalled_ = !canceled_; + + JFFAsyncOperation autoCancelOperation_ = [operationOwner autoCancelOnDeallocAsyncOperation:operation_]; + + __unsafe_unretained id weakDelegate = delegate; + + JFFDidFinishAsyncOperationCallback doneCallback = ^void(id result, NSError *error) { + + unsibscribeCancelBlockCalled = [error isKindOfClass:[JFFAsyncOpFinishedByUnsubscriptionError class]]; + NSLog(@"notify delegate: %@, with owner: %@", weakDelegate, operationOwner); }; - [ weakDelegate_ autoUnsubsribeOnDeallocAsyncOperation: autoCancelOperation_ ]( nil - , unsubscribeCallback_ - , ^void( id result_ - , NSError* error_ ) - { - NSLog( @"notify delegate: %@, with owner: %@", weakDelegate_, operationOwner_ ); - } ); + [weakDelegate autoUnsubsribeOnDeallocAsyncOperation:autoCancelOperation_](nil, nil, doneCallback); } } - GHAssertTrue( delegateDeallocated_ , @"OK" ); - GHAssertTrue( nativeCancelBlockCalled_ , @"OK" ); - GHAssertTrue( unsibscribeCancelBlockCalled_, @"OK" ); - nativeCancelBlockCalled_ = NO; + GHAssertTrue(delegateDeallocated , @"OK"); + GHAssertTrue(nativeCancelBlockCalled , @"OK"); + GHAssertTrue(unsibscribeCancelBlockCalled, @"OK"); + nativeCancelBlockCalled = NO; } - - GHAssertFalse( nativeCancelBlockCalled_, @"operation_ should be canceled here" ); + + GHAssertFalse( nativeCancelBlockCalled, @"operation_ should be canceled here" ); } GHAssertTrue(originalInstanceCount1 == [JFFSimpleBlockHolder instancesCount], @"All object of this class should be deallocated"); - GHAssertTrue(originalInstanceCount2 == [JFFCancelAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); + GHAssertTrue(originalInstanceCount2 == [JFFAsyncOperationHandlerBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount3 == [JFFAsyncOperationProgressBlockHolder instancesCount], @"All object of this class should be deallocated"); GHAssertTrue(originalInstanceCount4 == [JFFDidFinishAsyncOperationBlockHolder instancesCount], @"All object of this class should be deallocated"); } diff --git a/test/JFFCachesTest/Default-568h@2x.png b/test/JFFCachesTest/Default-568h@2x.png new file mode 100644 index 0000000..0891b7a Binary files /dev/null and b/test/JFFCachesTest/Default-568h@2x.png differ diff --git a/test/JFFContactsTest/JFFContactsTest/JFFContactsTest.m b/test/JFFContactsTest/JFFContactsTest/JFFContactsTest.m index 00514ba..fa2412a 100644 --- a/test/JFFContactsTest/JFFContactsTest/JFFContactsTest.m +++ b/test/JFFContactsTest/JFFContactsTest/JFFContactsTest.m @@ -221,7 +221,7 @@ - (void)testEnumerateAllContacts JFFAddressBookSuccessCallback onSuccess = ^(JFFAddressBook *book) { - NSArray *savedContacts = [contactIds forceMap: ^id(NSNumber *contactId) { + NSArray *savedContacts = [contactIds forceMap:^id(NSNumber *contactId) { return [JFFContact findContactWithContactInternalId:[contactId longLongValue] addressBook:book]; }]; diff --git a/test/JFFCoreLocationTest/JFFCoreLocationTest.xcodeproj/project.pbxproj b/test/JFFCoreLocationTest/JFFCoreLocationTest.xcodeproj/project.pbxproj index 66048dd..3611ce4 100644 --- a/test/JFFCoreLocationTest/JFFCoreLocationTest.xcodeproj/project.pbxproj +++ b/test/JFFCoreLocationTest/JFFCoreLocationTest.xcodeproj/project.pbxproj @@ -7,9 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + 4C11F7A0182792ED00229A6B /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C11F79F182792ED00229A6B /* QuartzCore.framework */; }; + 4C11F7A2182792F900229A6B /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C11F7A1182792F900229A6B /* CoreGraphics.framework */; }; CE206E2B16414CFF002476FD /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE206E2A16414CFF002476FD /* UIKit.framework */; }; CE206E2D16414CFF002476FD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE206E2C16414CFF002476FD /* Foundation.framework */; }; - CE206E2F16414CFF002476FD /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE206E2E16414CFF002476FD /* CoreGraphics.framework */; }; CE206E3516414CFF002476FD /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = CE206E3316414CFF002476FD /* InfoPlist.strings */; }; CE206E3716414CFF002476FD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = CE206E3616414CFF002476FD /* main.m */; }; CE206E3D16414CFF002476FD /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = CE206E3C16414CFF002476FD /* Default.png */; }; @@ -28,6 +29,13 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 4C11F795182792DF00229A6B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = CE206E7616414EE5002476FD /* JFFAsyncOperations.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 4C1A0F8D182577BE0020FBF6; + remoteInfo = JFFAsyncOperationsMacOS; + }; CE206E7216414EDE002476FD /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = CE206E6A16414EDE002476FD /* JFFCoreLocation.xcodeproj */; @@ -171,10 +179,11 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 4C11F79F182792ED00229A6B /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 4C11F7A1182792F900229A6B /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; CE206E2616414CFF002476FD /* JFFCoreLocationTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JFFCoreLocationTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; CE206E2A16414CFF002476FD /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; CE206E2C16414CFF002476FD /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - CE206E2E16414CFF002476FD /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; CE206E3216414CFF002476FD /* JFFCoreLocationTest-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "JFFCoreLocationTest-Info.plist"; sourceTree = ""; }; CE206E3416414CFF002476FD /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; CE206E3616414CFF002476FD /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; @@ -199,6 +208,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 4C11F7A2182792F900229A6B /* CoreGraphics.framework in Frameworks */, + 4C11F7A0182792ED00229A6B /* QuartzCore.framework in Frameworks */, CE206FC116415677002476FD /* CoreLocation.framework in Frameworks */, CE206EF516414FE7002476FD /* libJFFScheduler.a in Frameworks */, CE206EF616414FE7002476FD /* libJFFTestTools.a in Frameworks */, @@ -209,7 +220,6 @@ CE206EAC16414F05002476FD /* libJFFUtils.a in Frameworks */, CE206E2B16414CFF002476FD /* UIKit.framework in Frameworks */, CE206E2D16414CFF002476FD /* Foundation.framework in Frameworks */, - CE206E2F16414CFF002476FD /* CoreGraphics.framework in Frameworks */, CE206E6316414D2C002476FD /* GHUnitIOS.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -238,13 +248,14 @@ CE206E2916414CFF002476FD /* Frameworks */ = { isa = PBXGroup; children = ( + 4C11F7A1182792F900229A6B /* CoreGraphics.framework */, + 4C11F79F182792ED00229A6B /* QuartzCore.framework */, CE206EDD16414FC0002476FD /* libc++.dylib */, CE206EDB16414FB9002476FD /* libstdc++.dylib */, CE206FC016415677002476FD /* CoreLocation.framework */, CE206E6216414D2C002476FD /* GHUnitIOS.framework */, CE206E2A16414CFF002476FD /* UIKit.framework */, CE206E2C16414CFF002476FD /* Foundation.framework */, - CE206E2E16414CFF002476FD /* CoreGraphics.framework */, ); name = Frameworks; sourceTree = ""; @@ -299,6 +310,7 @@ CE206E8416414EE6002476FD /* libJFFAsyncOperations.a */, CE206E8616414EE6002476FD /* libJFFAsyncOperations-clang.a */, CE206E8816414EE6002476FD /* JFFAsyncOperationsFW.framework */, + 4C11F796182792DF00229A6B /* libJFFAsyncOperationsMacOS.a */, ); name = Products; sourceTree = ""; @@ -408,6 +420,13 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ + 4C11F796182792DF00229A6B /* libJFFAsyncOperationsMacOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libJFFAsyncOperationsMacOS.a; + remoteRef = 4C11F795182792DF00229A6B /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; CE206E7316414EDE002476FD /* libJFFCoreLocation.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; diff --git a/test/JFFNetworkTest/Classes/JFFConectionTest.m b/test/JFFNetworkTest/Classes/JFFConectionTest.m index 7710ecd..63f0b21 100755 --- a/test/JFFNetworkTest/Classes/JFFConectionTest.m +++ b/test/JFFNetworkTest/Classes/JFFConectionTest.m @@ -25,15 +25,14 @@ - (void)testHttp406NotAcceptableCode void (^testBlock)(JFFSimpleBlock) = ^(JFFSimpleBlock finishTest) { - JFFAsyncOperationProgressHandler progress = ^(NSData *dataChunk) - { + JFFAsyncOperationProgressCallback progress = ^(NSData *dataChunk) { if (!totalData) totalData = [NSMutableData new]; [totalData appendData:dataChunk]; }; - JFFDidFinishAsyncOperationHandler finish = ^(id result, NSError *error) - { + JFFDidFinishAsyncOperationCallback finish = ^(id result, NSError *error) { + didFinishLoadingBlockError = error; finishTest(); }; diff --git a/test/JFFNetworkTest/JFFNetworkTest.xcodeproj/project.pbxproj b/test/JFFNetworkTest/JFFNetworkTest.xcodeproj/project.pbxproj index c5e0fe1..214f1d8 100755 --- a/test/JFFNetworkTest/JFFNetworkTest.xcodeproj/project.pbxproj +++ b/test/JFFNetworkTest/JFFNetworkTest.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765A40DF7441C002DB57D /* CoreGraphics.framework */; }; + 4C11F7BD182793D300229A6B /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C11F7BC182793D300229A6B /* QuartzCore.framework */; }; 5310BA45141F4D7800A3E2B1 /* GHUnitIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5310BA44141F4D7800A3E2B1 /* GHUnitIOS.framework */; }; 5310BAEF141F51D300A3E2B1 /* libJFFUtils.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5310BA9B141F51AD00A3E2B1 /* libJFFUtils.a */; }; 5310BAF0141F51E000A3E2B1 /* libJFFScheduler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5310BA98141F51AD00A3E2B1 /* libJFFScheduler.a */; }; @@ -66,6 +67,13 @@ remoteGlobalIDString = 1BE0542A154826DA00270B58; remoteInfo = JFFTestTools; }; + 4C11F7C1182793D400229A6B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5310BA84141F51AD00A3E2B1 /* JFFAsyncOperations.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 4C1A0F8D182577BE0020FBF6; + remoteInfo = JFFAsyncOperationsMacOS; + }; 5310BA91141F51AD00A3E2B1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 5310BA84141F51AD00A3E2B1 /* JFFAsyncOperations.xcodeproj */; @@ -230,6 +238,7 @@ 288765A40DF7441C002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* JFFNetworkTest_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JFFNetworkTest_Prefix.pch; sourceTree = ""; }; + 4C11F7BC182793D300229A6B /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 5310BA44141F4D7800A3E2B1 /* GHUnitIOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GHUnitIOS.framework; path = ../../frameworks/GHUnitIOS.framework; sourceTree = SOURCE_ROOT; }; 5310BA84141F51AD00A3E2B1 /* JFFAsyncOperations.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = JFFAsyncOperations.xcodeproj; path = ../../lib/JFFAsyncOperations/JFFAsyncOperations.xcodeproj; sourceTree = SOURCE_ROOT; }; 5310BA87141F51AD00A3E2B1 /* JFFNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = JFFNetwork.xcodeproj; path = ../../lib/JFFNetwork/JFFNetwork.xcodeproj; sourceTree = SOURCE_ROOT; }; @@ -272,6 +281,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 4C11F7BD182793D300229A6B /* QuartzCore.framework in Frameworks */, 1BEC485C156A27270099DA6D /* libstdc++.dylib in Frameworks */, 1B0E89961563FAC800825E3C /* libc++.dylib in Frameworks */, 1B2669E615623FBD0054E183 /* libJFFTestTools.a in Frameworks */, @@ -393,6 +403,7 @@ 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( + 4C11F7BC182793D300229A6B /* QuartzCore.framework */, 1BEC485B156A27270099DA6D /* libstdc++.dylib */, 1B0E89951563FAC800825E3C /* libc++.dylib */, 53A33F2A141F65F700469DAA /* CFNetwork.framework */, @@ -411,6 +422,7 @@ 5310BA92141F51AD00A3E2B1 /* libJFFAsyncOperations.a */, 5357CDE314A9F4F80046EA34 /* libJFFAsyncOperations-clang.a */, 65B1F93B151A8B74000A1736 /* JFFAsyncOperationsFW.framework */, + 4C11F7C2182793D400229A6B /* libJFFAsyncOperationsMacOS.a */, ); name = Products; sourceTree = ""; @@ -580,6 +592,13 @@ remoteRef = 1B2669E215623FA80054E183 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 4C11F7C2182793D400229A6B /* libJFFAsyncOperationsMacOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libJFFAsyncOperationsMacOS.a; + remoteRef = 4C11F7C1182793D400229A6B /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 5310BA92141F51AD00A3E2B1 /* libJFFAsyncOperations.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; diff --git a/test/JFFRestKitTest/JFFRestKitTest/JFFDataLoadersToolsTests.m b/test/JFFRestKitTest/JFFRestKitTest/JFFDataLoadersToolsTests.m index cc70b19..38f1382 100644 --- a/test/JFFRestKitTest/JFFRestKitTest/JFFDataLoadersToolsTests.m +++ b/test/JFFRestKitTest/JFFRestKitTest/JFFDataLoadersToolsTests.m @@ -2,9 +2,9 @@ static JFFAsyncOperation testDataLoader(const int *buffer, int bufferSize) { - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback cancelCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { __block JFFTimer *timer = [JFFTimer new]; @@ -34,13 +34,15 @@ static JFFAsyncOperation testDataLoader(const int *buffer, int bufferSize) } } duration:.01]; - return ^(BOOL canceled) { + return ^(JFFAsyncOperationHandlerTask task) { + + NSCParameterAssert(task <= JFFAsyncOperationHandlerTaskCancel); if (!timer) return; if (cancelCallback) - cancelCallback(canceled); + cancelCallback(task); [timer cancelAllScheduledOperations]; timer = nil; @@ -75,7 +77,7 @@ - (void)testJTmpFileLoaderWithChunkedDataLoader JFFAsyncOperation loader = jTmpFileLoaderWithChunkedDataLoader(dataLoader); - JFFAsyncOperationProgressHandler progressCallback = ^(NSData *chunkData) { + JFFAsyncOperationProgressCallback progressCallback = ^(NSData *chunkData) { [chunks addObject:chunkData]; }; diff --git a/test/JFFRestKitTest/JFFRestKitTest/SmartDataLoaderTest.m b/test/JFFRestKitTest/JFFRestKitTest/SmartDataLoaderTest.m index 67ef171..e791e44 100644 --- a/test/JFFRestKitTest/JFFRestKitTest/SmartDataLoaderTest.m +++ b/test/JFFRestKitTest/JFFRestKitTest/SmartDataLoaderTest.m @@ -44,9 +44,9 @@ static JFFAsyncOperationBinder testDataLoader(BOOL *wasCalled) { return ^JFFAsyncOperation(NSURL *url) { NSData *response = [[url description] dataUsingEncoding:NSUTF8StringEncoding]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback cancelCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { if (wasCalled) *wasCalled = YES; return asyncOperationWithResult(response)(progressCallback, @@ -67,13 +67,13 @@ static JFFAsyncOperationBinder badTestDataLoader() static JFFAsyncOperationBinder differentTestDataLoader(BOOL *wasCalled) { - return ^JFFAsyncOperation(NSURL *url) - { + return ^JFFAsyncOperation(NSURL *url) { + NSData *response = [differntServerResponse dataUsingEncoding:NSUTF8StringEncoding]; - return ^JFFCancelAsyncOperation(JFFAsyncOperationProgressHandler progressCallback, - JFFCancelAsyncOperationHandler cancelCallback, - JFFDidFinishAsyncOperationHandler doneCallback) - { + return ^JFFAsyncOperationHandler(JFFAsyncOperationProgressCallback progressCallback, + JFFAsyncOperationChangeStateCallback cancelCallback, + JFFDidFinishAsyncOperationCallback doneCallback) { + if (wasCalled) *wasCalled = YES; return asyncOperationWithResult(response)(progressCallback, @@ -187,11 +187,11 @@ -(void)testUseCachedDataIfCannotLoadData __block NSString *storedDataString = nil; __block NSString *cachedDataString = nil; - loader(nil, nil, ^(id data, NSError *error_) { + loader(nil, nil, ^(id data, NSError *error) { storedDataString = data; - loaderWromCache( nil, nil, ^( id data_, NSError* error_ ) { - cachedDataString = data_; + loaderWromCache( nil, nil, ^(id data, NSError *error) { + cachedDataString = data; }); }); diff --git a/test/JFFSchedulerTest/JFFSchedulerTest.xcodeproj/project.pbxproj b/test/JFFSchedulerTest/JFFSchedulerTest.xcodeproj/project.pbxproj index dc6163c..89681f9 100644 --- a/test/JFFSchedulerTest/JFFSchedulerTest.xcodeproj/project.pbxproj +++ b/test/JFFSchedulerTest/JFFSchedulerTest.xcodeproj/project.pbxproj @@ -20,7 +20,9 @@ 1B41AD65151CD1EE00566B1B /* libJFFUtils.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B41AD5C151CD1E000566B1B /* libJFFUtils.a */; }; 1BEC47F7156A26B80099DA6D /* libstdc++.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1BEC47F6156A26B80099DA6D /* libstdc++.dylib */; }; 1BEE3D2615EFB43E0024D249 /* PerformSelectorTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BEE3D2515EFB43E0024D249 /* PerformSelectorTest.m */; }; + 4C11F7DC1827956900229A6B /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C11F7DB1827956900229A6B /* QuartzCore.framework */; }; 4C7F8060182008CC009785AF /* libJFFAsyncOperations.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C7F8059182008BB009785AF /* libJFFAsyncOperations.a */; }; + 4CDB8DC7182BBB5200C5BFA3 /* JFFAsyncOperationHelpersTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CDB8DC6182BBB5200C5BFA3 /* JFFAsyncOperationHelpersTest.m */; }; CE1BC2DB161B2E81007DEC95 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CE1BC2DA161B2E81007DEC95 /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ @@ -109,6 +111,13 @@ remoteGlobalIDString = D2AAC07D0554694100DB518D; remoteInfo = JFFUtils; }; + 4C11F7E01827956900229A6B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4C7F8052182008BB009785AF /* JFFAsyncOperations.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 4C1A0F8D182577BE0020FBF6; + remoteInfo = JFFAsyncOperationsMacOS; + }; 4C7F8058182008BB009785AF /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 4C7F8052182008BB009785AF /* JFFAsyncOperations.xcodeproj */; @@ -163,7 +172,9 @@ 1B41AD51151CD1E000566B1B /* JFFUtils.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = JFFUtils.xcodeproj; path = ../../lib/JFFUtils/JFFUtils.xcodeproj; sourceTree = ""; }; 1BEC47F6156A26B80099DA6D /* libstdc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libstdc++.dylib"; path = "usr/lib/libstdc++.dylib"; sourceTree = SDKROOT; }; 1BEE3D2515EFB43E0024D249 /* PerformSelectorTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PerformSelectorTest.m; sourceTree = ""; }; + 4C11F7DB1827956900229A6B /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 4C7F8052182008BB009785AF /* JFFAsyncOperations.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = JFFAsyncOperations.xcodeproj; path = ../../lib/JFFAsyncOperations/JFFAsyncOperations.xcodeproj; sourceTree = ""; }; + 4CDB8DC6182BBB5200C5BFA3 /* JFFAsyncOperationHelpersTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JFFAsyncOperationHelpersTest.m; sourceTree = ""; }; CE1BC2DA161B2E81007DEC95 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -172,6 +183,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 4C11F7DC1827956900229A6B /* QuartzCore.framework in Frameworks */, 4C7F8060182008CC009785AF /* libJFFAsyncOperations.a in Frameworks */, 1BEC47F7156A26B80099DA6D /* libstdc++.dylib in Frameworks */, 1B0E89441563FA7900825E3C /* libc++.dylib in Frameworks */, @@ -218,6 +230,7 @@ 1B41ACF8151CCF7100566B1B /* Frameworks */ = { isa = PBXGroup; children = ( + 4C11F7DB1827956900229A6B /* QuartzCore.framework */, 1B0E89431563FA7900825E3C /* libc++.dylib */, 1BEC47F6156A26B80099DA6D /* libstdc++.dylib */, 1B41AD19151CCF9300566B1B /* GHUnitIOS.framework */, @@ -234,6 +247,7 @@ 1B41AD00151CCF7100566B1B /* Supporting Files */, 1B41AD1C151CD08100566B1B /* JFFSchedulerTest.m */, 1BEE3D2515EFB43E0024D249 /* PerformSelectorTest.m */, + 4CDB8DC6182BBB5200C5BFA3 /* JFFAsyncOperationHelpersTest.m */, ); path = JFFSchedulerTest; sourceTree = ""; @@ -289,6 +303,7 @@ 4C7F8059182008BB009785AF /* libJFFAsyncOperations.a */, 4C7F805B182008BB009785AF /* libJFFAsyncOperations-clang.a */, 4C7F805D182008BB009785AF /* JFFAsyncOperationsFW.framework */, + 4C11F7E11827956900229A6B /* libJFFAsyncOperationsMacOS.a */, ); name = Products; sourceTree = ""; @@ -424,6 +439,13 @@ remoteRef = 1B41AD61151CD1E000566B1B /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 4C11F7E11827956900229A6B /* libJFFAsyncOperationsMacOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libJFFAsyncOperationsMacOS.a; + remoteRef = 4C11F7E01827956900229A6B /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 4C7F8059182008BB009785AF /* libJFFAsyncOperations.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -472,6 +494,7 @@ buildActionMask = 2147483647; files = ( 1B41AD06151CCF7100566B1B /* main.m in Sources */, + 4CDB8DC7182BBB5200C5BFA3 /* JFFAsyncOperationHelpersTest.m in Sources */, 1B41AD1D151CD08100566B1B /* JFFSchedulerTest.m in Sources */, 1BEE3D2615EFB43E0024D249 /* PerformSelectorTest.m in Sources */, ); diff --git a/test/JFFSchedulerTest/JFFSchedulerTest/JFFAsyncOperationHelpersTest.m b/test/JFFSchedulerTest/JFFSchedulerTest/JFFAsyncOperationHelpersTest.m new file mode 100644 index 0000000..3f29b1d --- /dev/null +++ b/test/JFFSchedulerTest/JFFSchedulerTest/JFFAsyncOperationHelpersTest.m @@ -0,0 +1,144 @@ + +#import +#import + +#import + +@interface JFFAsyncOperationHelpersTest : GHAsyncTestCase +@end + +@implementation JFFAsyncOperationHelpersTest + +- (void)setUp +{ + [JFFTimer enableInstancesCounting]; + [JFFAsyncOperationManager enableInstancesCounting]; +} + +- (void)testCancelFirstLoader +{ + NSUInteger initialInstanceCount1 = [JFFTimer instancesCount]; + NSUInteger initialInstanceCount2 = [JFFAsyncOperationManager instancesCount]; + + @autoreleasepool { + + JFFAsyncOperationManager *nativeLoaderManager = [JFFAsyncOperationManager new]; + + JFFContinueLoaderWithResult continueLoaderBuilder = ^JFFAsyncOperation(id result, NSError *error) { + + return nativeLoaderManager.loader; + }; + + JFFAsyncOperation loader = repeatAsyncOperationWithDelayLoader(nativeLoaderManager.loader, + continueLoaderBuilder, + 1000); + + loader(nil, nil, nil)(JFFAsyncOperationHandlerTaskCancel); + + GHAssertEquals((NSUInteger)1, nativeLoaderManager.loadingCount, nil); + } + + GHAssertEquals(initialInstanceCount1, [JFFTimer instancesCount], nil); + GHAssertEquals(initialInstanceCount2, [JFFAsyncOperationManager instancesCount], nil); +} + +- (void)testCancelTimerLoader +{ + NSUInteger initialInstanceCount1 = [JFFTimer instancesCount]; + NSUInteger initialInstanceCount2 = [JFFAsyncOperationManager instancesCount]; + + @autoreleasepool { + + JFFAsyncOperationManager *nativeLoaderManager = [JFFAsyncOperationManager new]; + JFFAsyncOperationManager *timerLoaderManager = [JFFAsyncOperationManager new]; + + __block BOOL thirdLoaderCreated = NO; + + JFFContinueLoaderWithResult continueLoaderBuilder = ^JFFAsyncOperation(id result, NSError *error) { + + thirdLoaderCreated = YES; + + return sequenceOfAsyncOperations(timerLoaderManager.loader, nativeLoaderManager.loader, nil); + }; + + JFFAsyncOperation loader = repeatAsyncOperationWithDelayLoader(nativeLoaderManager.loader, + continueLoaderBuilder, + 1000); + + JFFAsyncOperationHandler handler = loader(nil, nil, nil); + + nativeLoaderManager.loaderFinishBlock([NSNull new], nil); + + handler(JFFAsyncOperationHandlerTaskCancel); + + GHAssertTrue(thirdLoaderCreated, nil); + + GHAssertEquals((NSUInteger)1, nativeLoaderManager.loadingCount, nil); + GHAssertEquals((NSUInteger)1, timerLoaderManager .loadingCount, nil); + } + + GHAssertEquals(initialInstanceCount1, [JFFTimer instancesCount], nil); + GHAssertEquals(initialInstanceCount2, [JFFAsyncOperationManager instancesCount], nil); +} + +- (void)testCallThreeTimesNativeLoader +{ + NSUInteger initialInstanceCount1 = [JFFTimer instancesCount]; + NSUInteger initialInstanceCount2 = [JFFAsyncOperationManager instancesCount]; + + @autoreleasepool { + + JFFAsyncOperationManager *nativeLoaderManager = [JFFAsyncOperationManager new]; + nativeLoaderManager.finishAtLoading = YES; + + JFFContinueLoaderWithResult continueLoaderBuilder = ^JFFAsyncOperation(id result, NSError *error) { + + return result?nativeLoaderManager.loader:nil; + }; + + JFFAsyncOperation loader = repeatAsyncOperationWithDelayLoader(nativeLoaderManager.loader, + continueLoaderBuilder, + 3); + + JFFAsyncOperationHandler handler = loader(nil, nil, nil); + + handler(JFFAsyncOperationHandlerTaskCancel); + + GHAssertEquals((NSUInteger)4, nativeLoaderManager.loadingCount, nil); + } + + GHAssertEquals(initialInstanceCount1, [JFFTimer instancesCount], nil); + GHAssertEquals(initialInstanceCount2, [JFFAsyncOperationManager instancesCount], nil); +} + +- (void)testCallThreeTimesNativeLoaderOnError +{ + NSUInteger initialInstanceCount1 = [JFFTimer instancesCount]; + NSUInteger initialInstanceCount2 = [JFFAsyncOperationManager instancesCount]; + + @autoreleasepool { + + JFFAsyncOperationManager *nativeLoaderManager = [JFFAsyncOperationManager new]; + nativeLoaderManager.failAtLoading = YES; + + JFFContinueLoaderWithResult continueLoaderBuilder = ^JFFAsyncOperation(id result, NSError *error) { + + return error?nativeLoaderManager.loader:nil; + }; + + JFFAsyncOperation loader = repeatAsyncOperationWithDelayLoader(nativeLoaderManager.loader, + continueLoaderBuilder, + 3); + + JFFAsyncOperationHandler handler = loader(nil, nil, nil); + + handler(JFFAsyncOperationHandlerTaskCancel); + + GHAssertEquals((NSUInteger)4, nativeLoaderManager.loadingCount, nil); + } + + GHAssertEquals(initialInstanceCount1, [JFFTimer instancesCount], nil); + GHAssertEquals(initialInstanceCount2, [JFFAsyncOperationManager instancesCount], nil); +} + +@end diff --git a/test/JFFSchedulerTest/JFFSchedulerTest/JFFSchedulerTest.m b/test/JFFSchedulerTest/JFFSchedulerTest/JFFSchedulerTest.m index b12f6fe..30b14f2 100755 --- a/test/JFFSchedulerTest/JFFSchedulerTest/JFFSchedulerTest.m +++ b/test/JFFSchedulerTest/JFFSchedulerTest/JFFSchedulerTest.m @@ -14,26 +14,30 @@ - (void)setUp - (void)testCancelWhenDeallocedScheduler { - __block BOOL fired = NO; JFFTimer *sharedScheduler = [JFFTimer sharedByThreadTimer]; - const NSUInteger initialSchedulerInstancesCount_ = [JFFTimer instancesCount]; - __block NSTimeInterval timeDifference_ = 0; + const NSUInteger initialSchedulerInstancesCount = [JFFTimer instancesCount]; + + __block BOOL fired = NO; + __block NSTimeInterval timeDifference = 0; @autoreleasepool { + [[JFFTimer new] addBlock:^(JFFCancelScheduledBlock cancel) { + cancel(); fired = YES; - } duration: 0.1 ]; + } duration:0.1]; - NSDate* startDate_ = [ NSDate new ]; + NSDate *startDate = [NSDate new]; [sharedScheduler addBlock:^(JFFCancelScheduledBlock cancel) { - NSDate* finishDate_ = [ NSDate new ]; - timeDifference_ = [ finishDate_ timeIntervalSinceDate: startDate_ ]; + + NSDate *finishDate = [NSDate new]; + timeDifference = [finishDate timeIntervalSinceDate:startDate]; cancel(); [self notify:kGHUnitWaitStatusSuccess forSelector:_cmd]; - } duration: 0.2 ]; + } duration:0.2]; //GHAssertTrue( 0 != [JFFTimer instancesCount], @"OK"); } @@ -42,54 +46,60 @@ - (void)testCancelWhenDeallocedScheduler [self waitForStatus:kGHUnitWaitStatusSuccess timeout:1.]; GHAssertFalse(fired, @"OK" ); - GHAssertTrue(initialSchedulerInstancesCount_ == [JFFTimer instancesCount], @"OK"); - GHAssertTrue(timeDifference_ >= 0.2, @"OK" ); + GHAssertTrue(timeDifference >= 0.2, @"OK" ); + + GHAssertTrue(initialSchedulerInstancesCount == [JFFTimer instancesCount], @"OK"); } - (void)testCancelBlockReturned { - __block BOOL fired_ = NO; - JFFTimer *sharedScheduler_ = [JFFTimer sharedByThreadTimer]; - const NSUInteger initialSchedulerInstancesCount_ = [JFFTimer instancesCount]; - __block NSTimeInterval timeDifference_ = 0; + JFFTimer *sharedScheduler = [JFFTimer sharedByThreadTimer]; + const NSUInteger initialSchedulerInstancesCount = [JFFTimer instancesCount]; + + __block BOOL fired = NO; + __block NSTimeInterval timeDifference = 0; @autoreleasepool { - JFFCancelScheduledBlock mainCancel_ = [[JFFTimer new] addBlock:^(JFFCancelScheduledBlock cancel_) { - cancel_(); - fired_ = YES; - } duration: 0.2 ]; - [sharedScheduler_ addBlock: ^( JFFCancelScheduledBlock cancel_ ) { - mainCancel_(); - cancel_(); - } duration: 0.1 ]; + JFFCancelScheduledBlock mainCancel = [[JFFTimer new] addBlock:^(JFFCancelScheduledBlock cancel) { + cancel(); + fired = YES; + } duration:0.2]; - NSDate* startDate_ = [NSDate new]; + [sharedScheduler addBlock:^void(JFFCancelScheduledBlock cancel) { + mainCancel(); + cancel(); + } duration:0.1]; + + NSDate *startDate = [NSDate new]; - [sharedScheduler_ addBlock:^(JFFCancelScheduledBlock cancel_) { - NSDate* finishDate_ = [ NSDate new ]; - timeDifference_ = [ finishDate_ timeIntervalSinceDate: startDate_ ]; + [sharedScheduler addBlock:^(JFFCancelScheduledBlock cancel) { + + NSDate *finishDate = [NSDate new]; + timeDifference = [finishDate timeIntervalSinceDate:startDate]; - cancel_(); - [ self notify: kGHUnitWaitStatusSuccess forSelector: _cmd ]; - } duration: 0.3 ]; + cancel(); + [self notify:kGHUnitWaitStatusSuccess forSelector:_cmd]; + } duration:0.3]; //GHAssertTrue( 0 != [ JFFScheduler instancesCount ], @"OK" ); } - [ self prepare ]; - [ self waitForStatus: kGHUnitWaitStatusSuccess timeout: 1. ]; + [self prepare]; + [self waitForStatus:kGHUnitWaitStatusSuccess timeout:1.]; + + GHAssertFalse(fired, @"OK" ); + GHAssertTrue(timeDifference >= 0.3, @"OK" ); - GHAssertFalse( fired_, @"OK" ); - GHAssertTrue( initialSchedulerInstancesCount_ == [JFFTimer instancesCount], @"OK"); - GHAssertTrue( timeDifference_ >= 0.3, @"OK" ); + GHAssertTrue(initialSchedulerInstancesCount == [JFFTimer instancesCount], @"OK"); } - (void)testCancelAllScheduledOperations { - __block BOOL fired = NO; JFFTimer *sharedScheduler = [JFFTimer sharedByThreadTimer]; const NSUInteger initialSchedulerInstancesCount = [JFFTimer instancesCount]; + + __block BOOL fired = NO; __block NSTimeInterval timeDifference = 0; @autoreleasepool { @@ -99,12 +109,12 @@ - (void)testCancelAllScheduledOperations [timer addBlock:^(JFFCancelScheduledBlock cancel) { cancel(); fired = YES; - } duration:0.3 leeway:0.]; + } duration:0.6 leeway:0.]; [timer addBlock:^(JFFCancelScheduledBlock cancel) { cancel(); fired = YES; - } duration:0.3 leeway:0.]; + } duration:0.6 leeway:0.]; [sharedScheduler addBlock:^(JFFCancelScheduledBlock cancel) { [timer cancelAllScheduledOperations]; @@ -119,7 +129,7 @@ - (void)testCancelAllScheduledOperations cancel(); [self notify:kGHUnitWaitStatusSuccess forSelector:_cmd]; - } duration:0.3 leeway:0.]; + } duration:0.6 leeway:0.]; //GHAssertTrue( 0 != [ JFFScheduler instancesCount ], @"OK" ); } @@ -128,40 +138,46 @@ - (void)testCancelAllScheduledOperations [self waitForStatus:kGHUnitWaitStatusSuccess timeout:1.]; GHAssertFalse(fired, @"OK"); - GHAssertTrue(initialSchedulerInstancesCount == [JFFTimer instancesCount], @"OK"); GHAssertTrue(timeDifference >= 0.2, @"OK" ); + + GHAssertTrue(initialSchedulerInstancesCount == [JFFTimer instancesCount], @"OK"); } - (void)testNotmalScheduledOperationTwice { - JFFTimer *sharedScheduler_ = [JFFTimer sharedByThreadTimer]; - const NSUInteger initialSchedulerInstancesCount_ = [JFFTimer instancesCount]; - __block NSTimeInterval timeDifference_ = 0; + JFFTimer *sharedScheduler = [JFFTimer sharedByThreadTimer]; + + const NSUInteger initialSchedulerInstancesCount = [JFFTimer instancesCount]; + __block NSTimeInterval timeDifference = 0; @autoreleasepool { - NSDate* startDate_ = [ NSDate new ]; - __block BOOL fired_ = NO; - [ sharedScheduler_ addBlock: ^( JFFCancelScheduledBlock cancel_ ) { - if ( fired_ ) { - NSDate* finishDate_ = [ NSDate new ]; - timeDifference_ = [ finishDate_ timeIntervalSinceDate: startDate_ ]; + NSDate *startDate = [NSDate new]; + + __block BOOL fired = NO; + [sharedScheduler addBlock:^void(JFFCancelScheduledBlock cancel) { + + if (fired) { - cancel_(); - [ self notify: kGHUnitWaitStatusSuccess forSelector: _cmd ]; + NSDate *finishDate = [NSDate new]; + timeDifference = [finishDate timeIntervalSinceDate:startDate]; + + cancel(); + [self notify:kGHUnitWaitStatusSuccess forSelector:_cmd]; } - fired_ = YES; - } duration: 0.2 ]; + fired = YES; + } duration:0.2]; //GHAssertTrue( 0 != [ JFFScheduler instancesCount ], @"OK" ); } - [ self prepare ]; - [ self waitForStatus: kGHUnitWaitStatusSuccess timeout: 1. ]; + [self prepare]; + [self waitForStatus:kGHUnitWaitStatusSuccess timeout:1.]; + + GHAssertTrue(timeDifference >= 0.2, @"OK"); - GHAssertTrue(initialSchedulerInstancesCount_ == [JFFTimer instancesCount], @"OK"); - GHAssertTrue(timeDifference_ >= 0.2, @"OK"); + GHAssertTrue(initialSchedulerInstancesCount == [JFFTimer instancesCount], @"OK"); } @end diff --git a/test/JFFStoreKitTest/JFFStoreKitTest.xcodeproj/project.pbxproj b/test/JFFStoreKitTest/JFFStoreKitTest.xcodeproj/project.pbxproj index 72d8ad7..978697a 100644 --- a/test/JFFStoreKitTest/JFFStoreKitTest.xcodeproj/project.pbxproj +++ b/test/JFFStoreKitTest/JFFStoreKitTest.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 7E72C9E817FBEFDB0081F306 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E72C9E717FBEFDB0081F306 /* QuartzCore.framework */; }; CEBCBE6D1619C923007F805F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBCBE6C1619C923007F805F /* UIKit.framework */; }; CEBCBE6F1619C923007F805F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBCBE6E1619C923007F805F /* Foundation.framework */; }; CEBCBE711619C923007F805F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBCBE701619C923007F805F /* CoreGraphics.framework */; }; @@ -27,6 +28,13 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 7E72C9F417FBEFDB0081F306 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = CEBCBEA11619CC83007F805F /* JFFUtils.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 7ED3CB1516E6387B00E5A00F; + remoteInfo = "JFFUtilsTest-CI"; + }; CEBCBE9F1619CC7D007F805F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = CEBCBE981619CC7D007F805F /* JFFTestTools.xcodeproj */; @@ -170,6 +178,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 7E72C9E717FBEFDB0081F306 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; CEBCBE681619C923007F805F /* JFFStoreKitTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JFFStoreKitTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; CEBCBE6C1619C923007F805F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; CEBCBE6E1619C923007F805F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -197,6 +206,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 7E72C9E817FBEFDB0081F306 /* QuartzCore.framework in Frameworks */, CEBCBEFD1619CF7A007F805F /* StoreKit.framework in Frameworks */, CEBCBEFB1619CF6B007F805F /* libJFFStoreKit.a in Frameworks */, CEBCBEEA1619CCC2007F805F /* libstdc++.dylib in Frameworks */, @@ -235,6 +245,7 @@ CEBCBE6B1619C923007F805F /* Frameworks */ = { isa = PBXGroup; children = ( + 7E72C9E717FBEFDB0081F306 /* QuartzCore.framework */, CEBCBEE91619CCC2007F805F /* libstdc++.dylib */, CEBCBEFC1619CF7A007F805F /* StoreKit.framework */, CEBCBE921619CB36007F805F /* GHUnitIOS.framework */, @@ -296,6 +307,7 @@ CEBCBEB21619CC83007F805F /* libJFFUtils-clang.a */, CEBCBEB41619CC83007F805F /* JFFUtilsFW.framework */, CEBCBEB61619CC83007F805F /* JFFUtilsTest.octest */, + 7E72C9F517FBEFDB0081F306 /* JFFUtilsTest-CI.octest */, ); name = Products; sourceTree = ""; @@ -404,6 +416,13 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ + 7E72C9F517FBEFDB0081F306 /* JFFUtilsTest-CI.octest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "JFFUtilsTest-CI.octest"; + remoteRef = 7E72C9F417FBEFDB0081F306 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; CEBCBEA01619CC7D007F805F /* libJFFTestTools.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; diff --git a/test/JFFUITest/Classes/OpenApplicationAsyncOpTest.m b/test/JFFUITest/Classes/OpenApplicationAsyncOpTest.m index e5d54ee..aca77f4 100644 --- a/test/JFFUITest/Classes/OpenApplicationAsyncOpTest.m +++ b/test/JFFUITest/Classes/OpenApplicationAsyncOpTest.m @@ -21,7 +21,7 @@ @interface OpenApplicationAsyncOpTest : GHAsyncTestCase @implementation OpenApplicationAsyncOpTest --(void)__testActionWithTitle +- (void)__testActionWithTitle { __block NSURL *resultURL; diff --git a/test/JFFUtilsTest/JFFUtilsTest.xcodeproj/project.pbxproj b/test/JFFUtilsTest/JFFUtilsTest.xcodeproj/project.pbxproj index 01f21ff..693339c 100644 --- a/test/JFFUtilsTest/JFFUtilsTest.xcodeproj/project.pbxproj +++ b/test/JFFUtilsTest/JFFUtilsTest.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 1B0E89211563FA5200825E3C /* libc++.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B0E89201563FA5200825E3C /* libc++.dylib */; }; 1B2D8B6C154BF37C00360296 /* libJFFTestTools.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B2D8B69154BF36C00360296 /* libJFFTestTools.a */; }; + 4C11F80F182795F700229A6B /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C11F80E182795F700229A6B /* QuartzCore.framework */; }; 534CDFDE14A8CAAC0068F4DF /* JMStringHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 534CDFDD14A8CAAC0068F4DF /* JMStringHolder.m */; }; 7E7225DE1588891400210CBE /* DevNullTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E7225DD1588891400210CBE /* DevNullTest.m */; }; B69483EC1429C88400B8247E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B69483EB1429C88400B8247E /* UIKit.framework */; }; @@ -87,6 +88,7 @@ /* Begin PBXFileReference section */ 1B0E89201563FA5200825E3C /* libc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libc++.dylib"; path = "usr/lib/libc++.dylib"; sourceTree = SDKROOT; }; 1B2D8B61154BF36C00360296 /* JFFTestTools.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = JFFTestTools.xcodeproj; path = ../../lib/JFFTestTools/JFFTestTools.xcodeproj; sourceTree = ""; }; + 4C11F80E182795F700229A6B /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 534CDFD914A8CA290068F4DF /* libstdc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libstdc++.dylib"; path = "usr/lib/libstdc++.dylib"; sourceTree = SDKROOT; }; 534CDFDC14A8CAAC0068F4DF /* JMStringHolder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JMStringHolder.h; sourceTree = ""; }; 534CDFDD14A8CAAC0068F4DF /* JMStringHolder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JMStringHolder.m; sourceTree = ""; }; @@ -112,6 +114,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 4C11F80F182795F700229A6B /* QuartzCore.framework in Frameworks */, CE57FBE11611FA0900124D90 /* libstdc++.dylib in Frameworks */, 1B0E89211563FA5200825E3C /* libc++.dylib in Frameworks */, 1B2D8B6C154BF37C00360296 /* libJFFTestTools.a in Frameworks */, @@ -174,6 +177,7 @@ B69483EA1429C88400B8247E /* Frameworks */ = { isa = PBXGroup; children = ( + 4C11F80E182795F700229A6B /* QuartzCore.framework */, 1B0E89201563FA5200825E3C /* libc++.dylib */, 534CDFD914A8CA290068F4DF /* libstdc++.dylib */, B69484021429D3D300B8247E /* GHUnitIOS.framework */, @@ -405,11 +409,9 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = NO; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES; GCC_OPTIMIZATION_LEVEL = 0; @@ -418,7 +420,6 @@ "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_VERSION = com.apple.compilers.llvmgcc42; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; @@ -426,7 +427,7 @@ ../../lib/, ../../lib/JFFTestTools, ); - IPHONEOS_DEPLOYMENT_TARGET = 4.0; + IPHONEOS_DEPLOYMENT_TARGET = 5.1; New_Setting = ""; OTHER_LDFLAGS = "-all_load"; SDKROOT = iphoneos; @@ -438,13 +439,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = NO; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COPY_PHASE_STRIP = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES; - GCC_VERSION = com.apple.compilers.llvmgcc42; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; @@ -452,7 +450,7 @@ ../../lib/, ../../lib/JFFTestTools, ); - IPHONEOS_DEPLOYMENT_TARGET = 4.0; + IPHONEOS_DEPLOYMENT_TARGET = 5.1; New_Setting = ""; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_LDFLAGS = "-all_load"; @@ -475,7 +473,6 @@ GCC_GENERATE_TEST_COVERAGE_FILES = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JFFUtilsTest/JFFUtilsTest-Prefix.pch"; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INFOPLIST_FILE = "JFFUtilsTest/JFFUtilsTest-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 5.0; LIBRARY_SEARCH_PATHS = ( @@ -502,7 +499,6 @@ GCC_GENERATE_TEST_COVERAGE_FILES = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JFFUtilsTest/JFFUtilsTest-Prefix.pch"; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INFOPLIST_FILE = "JFFUtilsTest/JFFUtilsTest-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 5.0; LIBRARY_SEARCH_PATHS = (