iPhone - 线程和委派

时间:2011-02-21 19:25:18

标签: iphone multithreading delegation

我在后台线程中运行一些代码以从服务获取文本文件。该代码在某个时刻触发了代理。一旦调用了委托,它就会抛出SIGABRT错误,而且我的概念听起来也不合适。

在后台线程运行的代码:

- (void)FetchStores
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // Fetch from service
    NSString *serviceURL = @"http://../index.html";
    NSURL *myURL = [NSURL URLWithString:serviceURL];
    NSData *dataRep = [NSData dataWithContentsOfURL:myURL];

    storesList = [[Stores alloc] init];
    storesList.storesDelegate = self;
    [storesList FetchWithNSData:dataRep];

    [pool release];
}

一旦从服务中提取了所有商店,storesList对象将触发委托。委托被主线程中的函数捕获。

你有什么建议我做错了吗?

谢谢,

F。

2 个答案:

答案 0 :(得分:1)

FetchWithNSData:似乎很可能不会保留传递的dataRep,并且数据会在您排空本地自动释放池的下一行被取消分配?

答案 1 :(得分:1)

在某个地方调用委托时,你应该切换到主线程。 特别是如果在某个地方,您将根据提取的数据更新UI。

你可以使用 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait 进行转换。

也许是这样的:

storesList = [[Stores alloc] init];
storesList.storesDelegate = self;
[storesList performSelectorOnMainThread:@selector(FetchWithNSData:) withObject:dataRep waitUntilDone:TRUE];

在您的情况下,您应该使用waitUntilDone:TRUE,以便FetchWithNSData方法有机会保留数据。