在 objective-c 块中传递参数
pass parameter in 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);
}];
}
我有一些questions.I想将一个参数传递给名为completeBlock的块,但我不知道我应该使用什么类型的参数use.Should我使用弱类型还是强类型?无论是弱型还是强型,请告诉我原因。
您经常会使用弱引用,因为您通常不希望请求保持对相关对象的强引用。例如,如果您正在更新用户界面中的视图对象,如果视图在请求完成之前被关闭,则让网络请求保持对不再可见的用户界面控件的强引用没有任何好处。
有时,在关闭视图控制器时,取消任何仅用于该场景的未决网络请求很有用。在这种情况下,您可能希望保存对 POST
方法返回的 AFHTTPRequestOperation
对象的引用,然后 cancel
该请求保存在视图控制器的 dealloc
中。但这只有在您明确避免让块保持对视图控制器的强引用时才有效,即您使用了 weak
引用。
在您的情况下,您似乎正在发布数据,因此可能没有必要取消请求,因此后一点可能不相关。但是,尽管如此,如果您仅引用 UI 控件,而这些控件在请求为 运行 时可能会被关闭,那么您仍然可以使用弱引用。但是,如果您正在调用一些额外的实例方法,这些方法在请求完成后使用请求的结果更新持久存储,那么您可能需要强引用。
最重要的是,基本问题是在网络请求期间保留所讨论的对象是否至关重要(即完成块将具有强引用)。通常你不需要它,因此会支持弱引用。但是,如果没有更多关于您计划在传递给 getPostPraiseListWithSessionId
方法的闭包中执行的操作的信息,我们无法谈论您的具体情况。强或弱的选择不是 getPostPraiseListWithSessionId
方法的功能,而是您计划在提供给该方法的完成块中做什么的问题。
Rob 解释得更好,但长话短说,当您不太关心对象是否有效时,您会使用 weak
,允许在块使用之前对其进行 dealloc
ed它。 strong
当对象必须有效(并且在内存中)才能在您的块中使用时,应该使用。
另外,这里有一些你可以做的小改进(这与你的问题无关):
[[NSNumber alloc] initWithInt:pageNo]
可以用简单的 @(pageNo)
代替
- 如果
K_BASE_URL
和K_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
的方法。
我的程序:
- (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);
}];
}
我有一些questions.I想将一个参数传递给名为completeBlock的块,但我不知道我应该使用什么类型的参数use.Should我使用弱类型还是强类型?无论是弱型还是强型,请告诉我原因。
您经常会使用弱引用,因为您通常不希望请求保持对相关对象的强引用。例如,如果您正在更新用户界面中的视图对象,如果视图在请求完成之前被关闭,则让网络请求保持对不再可见的用户界面控件的强引用没有任何好处。
有时,在关闭视图控制器时,取消任何仅用于该场景的未决网络请求很有用。在这种情况下,您可能希望保存对 POST
方法返回的 AFHTTPRequestOperation
对象的引用,然后 cancel
该请求保存在视图控制器的 dealloc
中。但这只有在您明确避免让块保持对视图控制器的强引用时才有效,即您使用了 weak
引用。
在您的情况下,您似乎正在发布数据,因此可能没有必要取消请求,因此后一点可能不相关。但是,尽管如此,如果您仅引用 UI 控件,而这些控件在请求为 运行 时可能会被关闭,那么您仍然可以使用弱引用。但是,如果您正在调用一些额外的实例方法,这些方法在请求完成后使用请求的结果更新持久存储,那么您可能需要强引用。
最重要的是,基本问题是在网络请求期间保留所讨论的对象是否至关重要(即完成块将具有强引用)。通常你不需要它,因此会支持弱引用。但是,如果没有更多关于您计划在传递给 getPostPraiseListWithSessionId
方法的闭包中执行的操作的信息,我们无法谈论您的具体情况。强或弱的选择不是 getPostPraiseListWithSessionId
方法的功能,而是您计划在提供给该方法的完成块中做什么的问题。
Rob 解释得更好,但长话短说,当您不太关心对象是否有效时,您会使用 weak
,允许在块使用之前对其进行 dealloc
ed它。 strong
当对象必须有效(并且在内存中)才能在您的块中使用时,应该使用。
另外,这里有一些你可以做的小改进(这与你的问题无关):
[[NSNumber alloc] initWithInt:pageNo]
可以用简单的@(pageNo)
代替
- 如果
K_BASE_URL
和K_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
的方法。