我正在将数据发布到服务器(图像和字符串数据)。对于我要上传的每个对象,我在核心数据中都有一个名为“status”的属性。我在此属性中输入3个状态以指示上传状态:上传暂挂(尚未尝试上传或先前尝试失败),上传处理(当前上传)和上传完成(上传完成,成功)。我有一个计时器,用于检查数据库以上传所有待处理数据。
这是处理上传失败数据和离线数据的正确方法吗?
如果这是正确的方法,我在上传尝试但用户退出应用时或在何时将上传状态从“上传处理”更改为“上传待处理”或“上传完成”时出现问题请求超时。有谁知道如何处理这些情况?
顺便说一句,我使用ASIHTTPRequest作为向服务器发出请求的框架。
如何以最佳方式执行此操作的详细说明将获得赏金:)
谢谢!
答案 0 :(得分:1)
计时器的想法会起作用。通过计时器以适合您的应用程序的某个时间间隔调用数据管理器类的uploadOutstandingObjects
假设你有一个需要上传的'Foo'实体。您可以在数据管理器类中执行以下操作...
- (void)uploadOutstandingObjects {
// I use the great MagicalRecord class for Core Data fetching
// https://github.com/magicalpanda/MagicalRecord
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status == pending"]
NSArray *outstandingObjects = [Foo MR_findAllWithPredicate:predicate];
for (Foo *foo in outstandingObjects) {
[foo uploadToServer];
}
这样做的一种方法是使用通知。每当您开始上传时,您都会使该对象收听“uploadsStopped”通知。上传完成后,正在上传的对象将停止收听。
Foo Class:
- (void)uploadFailed {
// change status to upload pending in the database for this 'foo' object
}
- (void)uploadComplete {
// change status to upload complete in the database for this 'foo' object
}
-(void)uploadToServer {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(uploadFailed:)
name:@"uploadsStoppedNotification"
object:nil ];
// perform upload. If you are doing this synchronously...
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:<url here>];
[request startSynchronously];
if (![request error]) {
[self uploadSucceeded];
// stop listening to global upload notifications as upload attempt is over
[NSNotificationCenter removeObserver:self];
}
else {
[self uploadFailed];
// stop listening to global upload notifications as upload attempt is over
[NSNotificationCenter removeObserver:self];
}
如果您的应用退出,您可以处理更改尚未完成的“上传处理”对象的状态
- (void)applicationDidEnterBackground:(UIApplication *)application {
// this will fire to any objects which are listening to
// the "uploadsStoppedNotification"
[[NSNotificationCenter defaultCenter]
postNotificationName:@"uploadsStoppedNotification"
object:nil ];
答案 1 :(得分:0)
作为来自这个问题/答案的人们的替代方案,RestKit似乎是开箱即用的。
http://mobile.tutsplus.com/tutorials/iphone/advanced-restkit-development_iphone-sdk/