我已经多次使用AFNetworking为iOS编码遇到了这个问题,但到目前为止我已经找到了解决方法。
基本上,我想进行一个API调用,将一个值返回给我想要在调用的完成块中使用的主线程。
更具体地说,我有一个帖子对象(比如张贴一条推文或其他东西),它关联了#tags和@tags,我希望在在我的数据库中创建初始“推文”后发送 。我需要它在方法的完成块中,因为我需要使用post_id作为发布#tags和@tags的参数:
-(void)postToDB
{
_postId = [[[ReelRailsAFNClient sharedClient] createPostWithParameters:
@{@"user_id":_userId,
@"caption":_caption}
CompletionBlock:^(NSError *error) {
if(!error){
[self postHashtagsToDB:_postId];
[self postAttagsToDB:_postId];
}
}] postId];
}
在postHashtagsToDB和postAttagsToDB的主体内,_postId的计算结果为(null)。如何捕获postId并将其注入postHashtagsToDB
和postATtagsToDB
?
谢谢,
JA
修改:
这是我对createPostWithParameters的方法定义:CompletionBLock:
- (Post*) createPostWithParameters:(NSDictionary*)parameters
CompletionBlock:(AFNClientErrorCompletionBlock)block{
Post *post = [[Post alloc] init];
[self POST:@"posts" parameters:parameters
success:^(NSURLSessionDataTask *task, id responseObject){
NSLog(@"Post Created Successfully");
post = responseObject;
block(nil);
}failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"Post Not Created");
block(error);
}];
return post;
}
答案 0 :(得分:6)
ReelRailsAFNClient
似乎是您控制的一个类(我确实在Google上找到了一个结果 - 这个问题)。由于您控制它,我建议修改完成块API以提供帖子ID,如果您希望能够在块的内容中使用它。
旁注:尽量不要命名不具有前导大写字符的类。 CompletionBlock
是非常规的;将其替换为completionBlock
或仅completion
。
修改:您可以将API修改为:
typedef void (^AFNClientErrorCompletionBlock)(Post *post, NSError *error);
- (void)createPostWithParameters:(NSDictionary*)parameters
completionBlock:(AFNClientErrorCompletionBlock)block{
Post *post = [[Post alloc] init];
[self POST:@"posts" parameters:parameters
success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"Post Created Successfully");
post = responseObject;
block(post, nil);
}failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"Post Not Created");
block(post, error);
}];
}
旁注:如果要返回一个对象(即Post
的实例),最好不要将其分配给名为_postID
的对象。更合适的作业是_post
。