在objective-c块中传递参数

时间:2015-06-21 15:10:32

标签: objective-c block

我的节目:

- (void)getPostPraiseListWithSessionId:(NSString *)sid withPostId:(NSString *)postId withPageNo:(int)pageNo completeBlock:(void (^)(NSError *))complete{
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    NSDictionary *parameters = @{
                                 @"sid":sid,
                                 @"post_id":postId,
                                 @"pageNo":[[NSNumber alloc] initWithInt:pageNo],
                                 };
    [manager POST:[NSString stringWithFormat:@"%@%@",K_BASE_URL,K_GET_POST_PRAISE_LIST_URL] parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
        if([[responseObject objectForKey:@"state"] intValue] == 0){
            NSError *error = [NSError new];
            NSArray *postPraiseList = [MTLJSONAdapter modelOfClass:MSMPostPraiseInfo.class fromJSONDictionary:[responseObject objectForKey:@"data"] error:&error];
            complete(error);
        }else{
            NSError *error = [[NSError alloc] initWithDomain:MSMNETWORK_ERROR_DOMAIN code:[[responseObject objectForKey:@"state"] intValue] userInfo:@{@"message":[responseObject objectForKey:@"message"]}];
            complete(error);
        }

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
        complete(error);
    }];

}

我有一些问题。我想将一个参数传递给名为completeBlock的块,但我不知道应该使用哪种类型的参数。我应该使用弱类型还是强类型?无论何种类型弱或强,请告诉我原因。

2 个答案:

答案 0 :(得分:2)

Rob解释得更好,但是长话短说你使用weak当你不关心对象是否有效时,允许它在你使用块之前进行dealloc编辑它。当对象必须有效(并且在内存中)要在块内使用时,应使用strong

此外,您可以做一些小的改进(与您的问题无关):

  • [[NSNumber alloc] initWithInt:pageNo]可以替换为简单的@(pageNo)
  • 如果K_BASE_URLK_GET_POST_PRAISE_LIST_URL#define中声明为NSString*个宏,则您不需要使用stringWithFormat:,您只需使用[manager POST: K_BASE_URL K_GET_POST_PRAISE_LIST_URL parameters:(...)]
  • 在这种情况下,NSError *error = [NSError new];可能会更好地取消NSError *error = nil;,但这取决于MTLJSONAdapter的方法。

答案 1 :(得分:1)

通常,您将使用弱引用,因为您通常不希望请求维护对相关对象的强引用。例如,如果您正在更新用户界面中的视图对象,如果在请求完成之前视图被取消,那么让网络请求保持对不再可见的用户界面控件的强引用没有任何好处。

有时,在解除视图控制器时,取消任何仅用于该场景的待处理网络请求非常有用。在这种情况下,您可能希望保存对AFHTTPRequestOperation方法返回的POST对象的引用,然后保存cancel视图控制器的dealloc中的请求。但这只有在你明确避免让块保持强烈的引用回到视图控制器时才有效,即你使用了weak引用。

在您的情况下,您似乎是在发布数据,因此可能无需取消请求,因此后一点可能不相关。但是,尽管如此,如果您只是指在请求运行时可能会被解雇的UI控件,您仍可能仍然使用弱引用。但是,如果您在请求完成时调用一些正在使用请求结果更新持久性存储的其他实例方法,那么您可能需要强引用。

最重要的是,基本问题是在网络请求期间(即完成块具有强引用)是否保留所讨论的对象是至关重要的。一般来说,你不需要那样,因而有利于弱参考。但是,如果没有关于您计划在传递给getPostPraiseListWithSessionId方法的闭包中做什么的更多信息,我们就无法说明您的具体情况。强或弱的选择不是getPostPraiseListWithSessionId方法的函数,而是您计划在为此方法提供的完成块内做什么的问题。