我正在尝试使用基于肥皂的 Web 服务运行图像上传,并且这样做我在我的应用程序中面临 2 个关键问题。
问题 1:- 当应用程序将多个图像上传到服务器时,如果我的应用程序进入后台状态,那么我将停止执行 (application suspended state)
.当我的应用程序从后台返回到前台状态时,它会再次恢复我的后台线程。
问题 2:- 当我尝试从设备库在服务器上上传 160-170 张图像时。在服务器上上传 60-70 张图像后,我收到了内存警告。我处理该方法并尝试在应用程序中释放一些内存,然后我再次启动我的线程,当时我的应用程序崩溃了。//->> 对于第二期,我添加了 3 个不同的 Web 服务及其太长的代码,所以我不打算在这里分享。当我检查仪器时,它通常以最大 2 到 2.5 MB 的实时字节运行,但是当我上传线程时,它会逐渐增加,并且在某个选择点我收到了内存警告。我的代码包含 ARC 的功能,但我仍然遇到内存警告问题。
问题 1 的代码:-
- (void)applicationDidEnterBackground:(UIApplication *)application
{
UIDevice* device = [UIDevice currentDevice];
BOOL backgroundSupported = NO;
if ([device respondsToSelector:@selector(isMultitaskingSupported)])
{
backgroundSupported = device.multitaskingSupported;
}
//NSLog(@"backgroundSupported: %d", backgroundSupported);
if (backgroundSupported)
{
_IsBackground = TRUE;
UIApplication* app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:
^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),
^{
while (_IsBackground)
{
//// it contineous run my application within this state.
}
NSLog(@"Background loop ended");
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
}
}
最佳答案
1)
Apple 非常关心 iPhone 和 iPad 的电池生命周期,因此他们对可以在后台运行的东西非常严格(也就是说,不会太多)。
使用当前发布的 iOS 版本,当您的应用程序收到对“applicationDidEnterBackground:
”委托(delegate)方法的调用时,您只有大约 5 秒的时间来清理或正确挂起。
当您的应用程序在前台时,您需要想出一种通过后台线程上传图像的方法。这意味着您可以上传图片的唯一时间是您的应用对用户可见。
More information can be found in this closely related question .
2)
对于您的第二个问题,很明显您没有正确释放(或设置为“nil
”,或重置)在上传多个图像的过程中使用的某些变量,这就是为什么您看到内存使用量增加和增加并最终杀死您的应用程序。
您已经了解 Instruments,但听起来您需要更加熟悉 tracking down memory usage以及内存中的哪些东西占用了越来越多的空间。
关于iphone - 使用基于 SOAP 的网络服务将多个图像上传到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17967021/