IOS objective C 用 completionBlock 写函数
IOS objective C write function with completionBlock
您好,我正在写一个 function
来调用 API 并获取 response
然后存储到 coredata
实体(使用魔法记录)。我的方法很简单,不接受任何输入 return 什么(只调用 api 并将数据存储到 entity
。我的目的是在 success
时执行 completionBlock 代码并记录 error
(这样就可以在 viewController
中调用函数了。我仍然不知道如何正确地编写它。非常感谢任何帮助。
我的 Apiclient
typedef void (^ApiClientSuccess)(id responseObject);
typedef void (^ApiClientFailure)(NSError *error);
- (void)getSingpostContentsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure {
NSString *urlString = [NSString stringWithFormat:@"%@singpost-contents.php",CMS_BASE_URL];
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] requestWithMethod:GET_METHOD URLString:urlString parameters:nil error:nil];
[self sendJSONRequest:request success:^(NSURLResponse *response, id responseObject) {
success(responseObject);
} failure:^(NSError *error) {
failure(error);
[self reportAPIIssueURL:[request.URL absoluteString] payload:nil message:[error description]];
}];
}
我的函数(需要正确编写)以便我可以在函数完成执行时调用和编写一些代码
+ (void)API_SingPostContentOnCompletion:(void)completionBlock {
[[ApiClient sharedInstance] getSingpostContentsOnSuccess:^(id responseJSON) {
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSManagedObjectContext *localContext = [NSManagedObjectContext MR_rootSavingContext];
[responseJSON[@"root"] enumerateObjectsUsingBlock:^(id attributes, NSUInteger idx, BOOL *stop) {
Content *content = [Content MR_findFirstOrCreateByAttribute:@"name" withValue:attributes[@"Name"] inContext:localContext];
content.content = attributes[@"content"];
}];
[localContext MR_saveToPersistentStoreWithCompletion:^(BOOL contextDidSave, NSError * _Nullable error) {
if (error) NSLog(@"Error save content to persistentStore");
}];
// if (completionBlock) {
// dispatch_async(dispatch_get_main_queue(), ^{
// completionBlock();
// });
// }
});
} onFailure:^(NSError *error) {
// if (completionBlock) {
// dispatch_async(dispatch_get_main_queue(), ^{
// completionBlock(nil);
// });
// }
NSLog(@"Failed to get SingPost Content");
}];
}
声明块:
typedef void (^ SuccessBlock)(BOOL success, id response);
typedef void (^ FailureBlock)(NSError *error, NSInteger statusCode);
编写使用这些块的方法,例如简单的 AFNetworking POST 调用:
+ (void)myFunction:(NSString*)function success:(SuccessBlock)success failure:(FailureBlock)failure{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
....
[manager POST:functionURL parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (operation.response.statusCode == 201 || operation.response.statusCode == 200) {
success(YES,responseObject);
}else{
success(NO,responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
failure(error, operation.response.statusCode);
}];
}
并且您可以从其他 class:
调用您的方法
[YourClass myFunction:@"" success:^(BOOL success, id response) {
if(success){
//my call is success
}
} failure:^(NSError *error, NSInteger statusCode) {
}];
您好,我正在写一个 function
来调用 API 并获取 response
然后存储到 coredata
实体(使用魔法记录)。我的方法很简单,不接受任何输入 return 什么(只调用 api 并将数据存储到 entity
。我的目的是在 success
时执行 completionBlock 代码并记录 error
(这样就可以在 viewController
中调用函数了。我仍然不知道如何正确地编写它。非常感谢任何帮助。
我的 Apiclient
typedef void (^ApiClientSuccess)(id responseObject);
typedef void (^ApiClientFailure)(NSError *error);
- (void)getSingpostContentsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure {
NSString *urlString = [NSString stringWithFormat:@"%@singpost-contents.php",CMS_BASE_URL];
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] requestWithMethod:GET_METHOD URLString:urlString parameters:nil error:nil];
[self sendJSONRequest:request success:^(NSURLResponse *response, id responseObject) {
success(responseObject);
} failure:^(NSError *error) {
failure(error);
[self reportAPIIssueURL:[request.URL absoluteString] payload:nil message:[error description]];
}];
}
我的函数(需要正确编写)以便我可以在函数完成执行时调用和编写一些代码
+ (void)API_SingPostContentOnCompletion:(void)completionBlock {
[[ApiClient sharedInstance] getSingpostContentsOnSuccess:^(id responseJSON) {
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSManagedObjectContext *localContext = [NSManagedObjectContext MR_rootSavingContext];
[responseJSON[@"root"] enumerateObjectsUsingBlock:^(id attributes, NSUInteger idx, BOOL *stop) {
Content *content = [Content MR_findFirstOrCreateByAttribute:@"name" withValue:attributes[@"Name"] inContext:localContext];
content.content = attributes[@"content"];
}];
[localContext MR_saveToPersistentStoreWithCompletion:^(BOOL contextDidSave, NSError * _Nullable error) {
if (error) NSLog(@"Error save content to persistentStore");
}];
// if (completionBlock) {
// dispatch_async(dispatch_get_main_queue(), ^{
// completionBlock();
// });
// }
});
} onFailure:^(NSError *error) {
// if (completionBlock) {
// dispatch_async(dispatch_get_main_queue(), ^{
// completionBlock(nil);
// });
// }
NSLog(@"Failed to get SingPost Content");
}];
}
声明块:
typedef void (^ SuccessBlock)(BOOL success, id response);
typedef void (^ FailureBlock)(NSError *error, NSInteger statusCode);
编写使用这些块的方法,例如简单的 AFNetworking POST 调用:
+ (void)myFunction:(NSString*)function success:(SuccessBlock)success failure:(FailureBlock)failure{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
....
[manager POST:functionURL parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (operation.response.statusCode == 201 || operation.response.statusCode == 200) {
success(YES,responseObject);
}else{
success(NO,responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
failure(error, operation.response.statusCode);
}];
}
并且您可以从其他 class:
调用您的方法[YourClass myFunction:@"" success:^(BOOL success, id response) {
if(success){
//my call is success
}
} failure:^(NSError *error, NSInteger statusCode) {
}];