这是我关于stackoverflow的第一个问题。我正在开发一个iOS应用,该应用使用来自网络上MySQL服务器的数据。我创建了一个名为“DataController”的类,该类完全管理同步过程,并使用带有委托的NSURLConnection来检索信息,对其进行解析并将其存储在CoreData模型中。它在此过程中使用了几种方法,如下所示:
[self.dataControllerObject syncStudents]
syncStudents被称为
->从服务器获取下载列表
->存储必须在NSArray属性中下载的所有元素的ID
->调用syncNextStudent
syncNextStudent被称为
->从NSArray-property获取第一个元素
->建立NSURLConnection来检索数据
调用connectionDidFinishLoading
->数据存储在CoreData中
-> ID从NSArray属性中删除
->调用syncNextStudent
syncNextStudent最终将不再有数组元素,并完成该过程。
我希望我明确了功能。现在这是我的问题:
如何中止整个过程,例如当用户不想立即同步并单击某个按钮时?
我试图创建DataController对象,并使用[self performSelectorInBackground:@selector(startSyncing)withObject:nil]调用syncStudents方法另一个线程,但是现在我的NSURLConnection不会触发任何委托方法。
我能做什么?
提前致谢。
最佳答案
您应该看看使用NSOperation
和NSOperationQueue
而不是performSelectorInBackground:
。这使您可以更好地控制需要在后台执行的一批任务,并立即取消所有操作。这是我的建议。
将NSOperationQueue
声明为属性
@property (nonatomic, retain) NSOperationQueue *operationQueue;
然后在您的实现文件中实例化它:
_operationQueue = [[NSOperationQueue] alloc] init];
创建一个
NSOperation
派生类来进行处理。@interface StudentOperation : NSOperation
// Declare a property for your student ID
@property (nonatomic, strong) NSNumber *studentID;
@end
然后遍历创建操作所需的任何集合。
for (NSSNumber *studentID in studentIDs) { // Your array of ids
StudentOperation *operation = [[StudentOperation alloc] init];
// Add any parameters your operation needs like student ID
[operation setStudentID:studentID];
// Add it to the queue
[_operationQueue addOperation:operation];
}
要取消时,只需告诉操作队列:
[_operationQueue cancelAllOperations];
请记住,这将立即取消队列中当前未处理的所有操作。如果要停止当前正在运行的任何操作,则必须将代码添加到
NSOperation
派生类(上面的StudentOperation
)中,以对此进行检查。因此,假设您的NSOperation
代码正在运行其main()函数。您需要定期检查并查看是否已设置cancelled
标志。@implementation StudentOperation
- (void)main
{
// Kick off your async NSURLConnection download here.
NSURLRequest *theRequest = [NSURLRequest requestWithURL...
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
// ...
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// Append the data
[receivedData appendData:data];
// Check and see if we need to cancel
if ([self isCancelled]) {
// Close the connection. Do any other cleanup
}
}
@end
关于ios - 立即停止方法/对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14855504/