Objective c 将NSURLconnection用于到API的多个POST
我在这里遇到了一个情况,我有一些模板(对象),我想把它们推到我的后端。现在,当用户按下synchronise按钮时,有一个到后端表单的连接,我得到了所有模板。将IPAD应用程序上的模板与从后端传输的模板进行比较。如果IPAD应用程序上的模板ID为(0),则会向后端发送帖子。后端然后返回保存的模板及其ID(添加到本地存储的模板) 现在我想我这里的问题是,我使用相同的连接(templateupdateconnection=>bad name…)来处理所有到后端的帖子。实际的问题是,在connectiondidfinishloading方法中,我只得到最后一个发布到后端的模板的响应 谁知道我怎么解决这个问题 提前谢谢 代码Objective c 将NSURLconnection用于到API的多个POST,objective-c,http-post,nsurlconnection,Objective C,Http Post,Nsurlconnection,我在这里遇到了一个情况,我有一些模板(对象),我想把它们推到我的后端。现在,当用户按下synchronise按钮时,有一个到后端表单的连接,我得到了所有模板。将IPAD应用程序上的模板与从后端传输的模板进行比较。如果IPAD应用程序上的模板ID为(0),则会向后端发送帖子。后端然后返回保存的模板及其ID(添加到本地存储的模板) 现在我想我这里的问题是,我使用相同的连接(templateupdateconnection=>bad name…)来处理所有到后端的帖子。实际的问题是,在connecti
-(void)syncRegistrations:(NSArray *)arrayOfRegistrations{
NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setEntity:[NSEntityDescription entityForName:@"Registration" inManagedObjectContext:self.managedObjectContext]];
NSError *error;
NSArray *Data = [self.managedObjectContext executeFetchRequest:request error:&error];
BOOL old=FALSE;
for(int registrationCounter = 0; registrationCounter < arrayOfRegistrations.count; registrationCounter ++){
NSDictionary *dictRegistration = [arrayOfRegistrations objectAtIndex:registrationCounter];
for(Registration *registration in Data){
if([dictRegistration objectForKey:@"id"] == registration.id){
old = TRUE;
}
else if ([registration.id intValue]==0){
NSString *jsonRequest = [NSString stringWithFormat:@"{\"form\":%@}",registration.form.id];
NSLog(@" de jsonrequest: %@",jsonRequest);
NSURL *url = [NSURL URLWithString:@"http://mybackend/registrations"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
NSData *requestData = [NSData dataWithBytes:[jsonRequest UTF8String] length:[jsonRequest length]];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody: requestData];
self.registrationtoupdate = registration;
self.registrationUpdateConnection = NULL;
self.registrationUpdateConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[self.registrationUpdateConnection start];
registration.id=[NSNumber numberWithInteger:-1];
[self.managedObjectContext save:&error];
old=TRUE;
}
}
if(old==FALSE){
//nieuwe template toevoegen
Registration *registration = [NSEntityDescription insertNewObjectForEntityForName:@"Registration" inManagedObjectContext:self.managedObjectContext];
registration.id = [dictRegistration objectForKey:@"id"];
registration.form = [self getFormByID:[dictRegistration objectForKey:@"form"]];
[self.managedObjectContext save:&error];
}
old=FALSE;
}
//[self getRC];
[self performSelector:@selector(getRC) withObject:nil afterDelay:3];
}
您应该将
NSURLConnection
和所有相关状态数据封装到一个类中。让该类有一个异步启动连接的start
方法和一个完成块,该完成块有一个表示请求最终结果的参数结果。这样,您就不会使响应数据与其他连接不匹配
然后,在完成块中,引用相应的上下文(注册到更新),获取JSON表示,并针对给定的托管对象上下文在正确的线程或队列上适当地更新上下文(请参见下面的“线程限制”):
因此,基本上:
else if ([registration.id intValue]==0) {
// setup the request
NSMutableURLRequest *request = ...
MyHTTPRequestOperation* op =
[[MyHTTPRequestOperation alloc] initWithRequest:request
completion:^(void)(id result)
{
if (![result isKindOfClass:[NSError class]]) {
assert(result != nil && [result isKindOfClass:[NSData class]]);
NSDictionary* dictRegistration =
[NSJSONSerializationJSONObjectWithData:result
options:kNilOptions
error:&error];
// Todo: check if dictRegistration has the required type
id newRegistrationID = [dictRegistration objectForKey:@"id"];
// Update the model on the thread/queue you defined for the
// NSManagedObjectContext:
[self updateRegistration:registration withID: newRegistrationID];
}
else {
// an error occurred
}
}];
[op start];
registration.id=[NSNumber numberWithInteger:-1];
}
您应该熟悉NSModelObjectContext和“线程限制”
另请参见:-(id)initWithConcurrencyType:(NSManagedObjectContextConcurrencyType)ct
核心数据最佳实践位于(需要开发人员帐户)@CouchDeveloper,感谢您让我走上正轨 最终的解决方案不是创建NSURLConnection的子类,而是将完成块与简单的NSURLConnection结合使用。检查以下代码:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
if ([data length] > 0 && error == nil){
NSDictionary *dictrc = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
NSLog(@"de data van de rc is: %@",dictrc);
rc.id = [dictrc objectForKey:@"id"];
[self.managedObjectContext save:&error];
}
}];
谢谢你的回答!我知道你想去哪里,但是你能给我一个新连接类的完整例子吗,因为我不知道怎么做。这是完全有效的。只是,这种方便的方法不适用于更高级的用例,如身份验证、将数据保存到文件、,等等。正确创建MyHTTPRequestOperation——可能从简单到具有挑战性。下面是一个非常简单的HTTP请求类实现示例:它用于试验和了解
sendAsynchronousRequest:queue:completionHandler:
的幕后黑手是什么未指定sendAsynchronousRequest:queue:completionHandler:
的completionBlock的执行上下文。也就是说,它可以是任何线程。您应该明确阅读“核心数据和线程优化”,并在正确的线程或队列上执行save:
!上面的代码很可能会崩溃并表现出意外行为。
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
if ([data length] > 0 && error == nil){
NSDictionary *dictrc = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
NSLog(@"de data van de rc is: %@",dictrc);
rc.id = [dictrc objectForKey:@"id"];
[self.managedObjectContext save:&error];
}
}];