【问题标题】:Network communication in main UI thread主 UI 线程中的网络通信
【发布时间】:2012-12-01 12:38:46
【问题描述】:

我有以下担忧..

我的应用程序在第一次启动时会下载 6 MB 的数据。 在此过程中,UIView 会显示有关正在进行的下载的信息,并且通常不会与用户交互。

因为我在主 UI 线程中使用dispatch_async 完成所有数据的下载,但现在我不知道这是否是最佳解决方案以及 Apple 在我提交申请时会说什么。

你能指导我这是否可以吗?

更新
调度代码

//Called at the end of [UIViewController viewDidLoad]
-(void)splashScreenAppeared
{
myTabBarController_.loadingLabel.text = NSLocalizedString(@"Checking for updates",@"launch progress");
dispatch_queue_t d_queue = dispatch_get_main_queue();
[self launchActionCheckIfDataIsStored:d_queue];
}
//...
-(void)launchActionCheckIfDataIsStored:(dispatch_queue_t)queue
{
dispatch_async(queue, ^ {
    //If there is no data stored in core data then download xml data files and images
    if (![self isAnyDataStoredInCoreData]) {
        launchNoDataStored_ = YES;
        [self launchDownloadData:queue];
    } else {
        launchNoDataStored_ = NO;
        [self launchCheckNewVersion:queue];
    }

});
}
//...
-(void)launchDownloadData:(dispatch_queue_t)queue
{        
myTabBarController_.loadingLabel.text = NSLocalizedString(@"Downloading catalog data",@"launch progress");
dispatch_async(queue, ^ {
    [self loadMenuData];
    if (seriousError_) {
        [self launchSeriousError:queue];
        return;
    }

    myTabBarController_.loadingLabel.text = NSLocalizedString(@"Downloading products details",@"launch progress");
    dispatch_async(queue, ^ {
        [self loadProductsData];
        if (seriousError_) {
            [self launchSeriousError:queue];
            return;
        }
//...
//And so on with other parts of download
}

【问题讨论】:

  • 发布您的调度代码。

标签: objective-c ios multithreading networking


【解决方案1】:

只是为了设置背景,我已经编写并提交了 2 个成功的应用到 App Store,所以你知道我不是在假设。

回来,您可以将下载推送到后台线程并以滑块的形式更新进度(为了用户的利益)。但是,如果在这种情况下,用户无论如何都不能做任何事情,那么就没有意义了。

另外,我认为 Apple 不会仅仅因为这个而拒绝您的应用程序。他们检查的主要内容之一是您是否使用了任何私有 API 或更基本的东西,例如应用程序崩溃。所以继续提交应用商店审核...

【讨论】:

  • 感谢您的快速回复,但由于某些原因,当我从 Xcode 运行它时,我的应用程序在启动时崩溃了。以前它工作得很好.. 嗯
  • 嘿,我似乎没有使用正确的配置文件签署我的应用程序。最近我将配置文件更改为发布,因此可以将其设置为 ipa 以用于测试目的。朱皮:)
【解决方案2】:

现在我知道 UI Thread 中的网络通信可能是 Apple 拒绝您的应用程序的一个很好的理由。

考虑以下场景:

  • 应用程序适用于 iPhone。
  • 没有与用户交互。
  • 应用程序在 iPad 上运行!!

即使没有与用户交互,当用户在 iPad 上按下 2x 按钮时,应用程序也不会做出反应。

所以 UI 线程中的网络通信是有效的,但如果申请不是仅适用于 iPad,那么申请将在 Apple 审核过程中被拒绝。

【讨论】:

    猜你喜欢
    • 2013-10-09
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    相关资源
    最近更新 更多