【问题标题】:iPhone - Threading and DelegationiPhone - 线程和委托
【发布时间】:2011-07-01 12:21:47
【问题描述】:

我正在后台线程中运行一些代码以从服务中获取文本文件。该代码在某些时候会触发一个委托。一旦调用了委托,它就会抛出 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.

【问题讨论】:

  • SIGABRT 通常意味着异常。日志中的信息是什么?

标签: iphone multithreading delegation


【解决方案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 方法有机会保留数据。

【讨论】:

  • 谢谢你。它解决了 SIGABRT,但该应用程序后来行为不端,即它不像我不使用 bg 线程时那样工作。你有什么想法?我应该尝试其他线程吗?再次感谢! f.
  • 你用什么做线程。你只展示了使用线程的代码。您可以编辑您的帖子并复制粘贴您开始帖子的部分吗?
  • 到目前为止,我个人还没有手动使用线程。 UIKit 中已经有一些类可以在单独的线程上工作,而您不必担心。例如,我使用 NSURLConnection 在不同的线程上下载东西。它确保它在主线程上调用我的委托方法,以便我可以安全地更新 UI 或执行其他任何操作。
【解决方案2】:

FetchWithNSData: 似乎很可能没有保留传递的dataRep,并且数据在您耗尽本地自动释放池的下一行被释放?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多