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) {

    }];