0

我的代码:

NSMutableArray *sstr = [[DBModel database]getCName];
NSArray *aarr = [[sstr objectAtIndex:0] componentsSeparatedByString:@"!"];

acName = [aarr objectAtIndex:0];
acMobileno = [aarr objectAtIndex:1];

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http:///userstatus.php?name=%@&mobileno=%@&status=off",[aarr objectAtIndex:0],[aarr objectAtIndex:1]]];

NSMutableURLRequest *postRequest = [[NSMutableURLRequest alloc]initWithURL:url];
[postRequest setHTTPMethod:@"POST"];

NSString *stringBoundary = @"------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary];
[postRequest addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *postBody = [NSMutableData data];

//name
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"name\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"%@",[aarr objectAtIndex:0]] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
//mobileno
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"mobileno\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"%@",[aarr objectAtIndex:1]] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
//status
NSString *status = @"off";
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"status\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"%@",status] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

[postRequest setHTTPBody:postBody];

NSData *returndata=[NSURLConnection sendSynchronousRequest:postRequest returningResponse:nil error:nil];

NSString *string1=[[NSString alloc]initWithData:returndata encoding:NSUTF8StringEncoding];

NSLog(@"OFF Status report = %@",string1);

我正在使用performSelectorInBackground:indidEnterBackground方法运行此代码。

有时它会给我一个奇怪的问题,即不更新服务器中的表。

使用performSelector委托方法有问题还是应该将此请求更改为异步?

4

1 回答 1

1

当您的应用程序进入后台时,您似乎正在启动网络请求。这意味着,例如,当用户关闭应用程序时,您开始进行网络事务。这不是 Apple 打算让应用程序工作的方式(理想情况下)。

applicationDidEnterBackground 的文档中:(粗体是我的):

您对此方法的实现大约有五秒钟的时间来执行任何任务并返回。如果您需要额外的时间来执行任何最终任务,您可以通过调用 beginBackgroundTaskWithExpirationHandler: 从系统请求额外的执行时间。在实践中,您应该尽快从 applicationDidEnterBackground: 返回。如果该方法在时间用完之前没有返回,则您的应用程序将被终止并从内存中清除。

因此,您可能会看到您的网络事务并不总是足够快地完成。

我建议重新考虑您的应用程序。 applicationDidEnterBackground:可能不是做这项工作的合适时间。如果你真的需要在后台做一些工作,请看这个使用后台任务的例子。如果您将代码放在后台任务中,那么您应该能够使用NSURLConnection同步异步请求。

于 2013-05-30T04:42:46.953 回答