2016-08-08 6 views
0

こんにちは私はfunctionを呼び出してAPIを呼び出してresponseを入手してcoredataエンティティ(魔法のレコードを使用)に保存します。簡単な私のメソッドは入力を取らず、何も返さない(のみentityにAPIとデータ格納を呼んでいます。私の目的は、completionBlockコードsuccessを実行しerrorが(そのためにはviewControllerで関数を呼び出すことができますログインすることです。私はまだいませんよそれを正しく書く方法を知っている。Anyhelpはずっと感謝している。IOSの目的C write関数with completionBlock

をマイ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]]; 
    }]; 
} 

My機能(それを適切に記述する必要があります)関数は

を実行完了したときに、私はいくつかのコードを呼び出すと書くことができるように、
+ (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"); 
    }]; 

} 

答えて

2

は、ブロックを宣言します。

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); 
     }]; 
    } 

を、あなたは他のクラスから自分のメソッドを呼び出すことができます。

[YourClass myFunction:@"" success:^(BOOL success, id response) { 
     if(success){ 
      //my call is success 
     } 
    } failure:^(NSError *error, NSInteger statusCode) { 

    }]; 
+0

おかげで、私は歳が示唆するよう記述しようとします。私は次のように書くことができます:+(void)API_SingPostContentOnCompletion:(void(^)(BOOL success))completionBlock {}これは使えますか? PARAMの方法で –

+0

あなたはtypedefを無効としてブロックを宣言する場合は、あなたが(^空間を使用するために持っていけない...あなたは直接宣言を渡したい場合は、あなたのようなものを行うことができます - 。(無効)のMyFunction:(ボイド(^)(ID、int型))myBlock;? –

+0

あなたは2.xのために、私は3.xのためにいくつかの変更に応じてそれはAFNetworking 2.6用です –