具有完成块的Objective-C方法返回我想在完成块中使用的值

时间:2014-11-12 20:25:48

标签: ios multithreading objective-c-blocks afnetworking-2

我已经多次使用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并将其注入postHashtagsToDBpostATtagsToDB

谢谢,

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

1 个答案:

答案 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