这是我关于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不会触发任何委托方法。

我能做什么?

提前致谢。

最佳答案

您应该看看使用NSOperationNSOperationQueue而不是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/

10-13 00:06