objective c - NSURLSession uploadTaskWithRequest - use block within completion handler -
i have class manages calls api. has method manage this, lets call callapimethod:
this method accepts success , fail block.
inside method, call uploadtaskwithrequest make call api. within uploadtaskwithrequest completion handler i'd (depending on result) pass results through either success or fail blocks.
i'm having issues this. works , keeping super tidy when call callapimethod using success/fail blocks it's locking ui/mainthread rather being asynchronous i'd expect.
how should go implementing pattern? or there better way go it?
i don't need support pre-ios7.
thanks
edit: basic implementation discussed above.
- (void)callapimethod:(nsstring *)method withdata:(nsstring *)requestdata as:(krequesttype)requesttype success:(void (^)(id responsedata))success failure:(void (^)(nsstring *errordescription))failure { [redacted] nsurlsession *session = [nsurlsession sharedsession]; nsurlsessiondatatask *task = [session uploadtaskwithrequest:request fromdata:postdata completionhandler: ^(nsdata *data, nsurlresponse *response, nserror *error) { if (error) { failure(error.description); } else { nserror *jsonerror; id responsedata = [nsjsonserialization jsonobjectwithdata:data options:kniloptions error:&jsonerror]; if (jsonerror) { failure(jsonerror.description); } else { success(responsedata); } } }]; [task resume]; } callapi method, used follows (from uitableviewcontroller):
[apicontroller callapimethod:@"users.json?action=token" withdata:logindata as:krequestpost success:^(id responsedata) { if ([responsedata iskindofclass:[nsdictionary class]]) { if ([responsedata objectforkey:@"token"]) { //store token/credentials } else if ([responsedata objectforkey:@"error"]) { //error [self displayerrormessage:[responsedata objectforkey:@"error"]]; return; } else { //undefined error [self displayerrormessage:nil]; return; } } else { //error [self displayerrormessage:nil]; return; } //if login success } failure:^(nsstring *errordescription) { [self displayerrormessage:errordescription]; }];
your nsurlsession code looks fine. i'd suggest adding breakpoints can identify if deadlocking somewhere , if so, where. nothing in code sample suggest such problem.
i suggest ensure ui calls dispatched main queue. nsurlsessionuploadtask completion handler may called on background queue, ui updates (alerts, navigation, updating of uiview controls, etc.) must take place on main queue.
Comments
Post a Comment