2015-08-14 95 views
2

我有一个场景,我有本地化文件从服务器下载。我在应用程序开始时下载文件并将其存储在文件夹中。就像其英文文件一样,我将其存储在文件夹'en.lproj'中,并且名称为Localizable.strings如何卸载NSBundle?

现在,当下载文件时,我使用bundleWithPath:方法加载该包。一旦它被加载,我显示本地化使用方法

NSLocalizedStringFromTableInBundle(key,@“Localizable”,bundle,@“”);

直到这里它工作正常。 现在,如果文件从服务器更新,我再次下载英文文件,并用新文件替换旧文件。 但是,应用程序显示了被替换的旧文件的本地化。 任何人都可以告诉我,我们是否可以重新加载捆绑包,以便反映更新。

在上述情况下,应用程序在文件更新时不会被终止。 如果我终止应用程序并重新启动它,则会反映更改。 但我希望在不杀死应用程序的情况下反映更改。

是否有任何方法卸载加载的NSBundle?

+0

在真实的iOS设备上,您无法更新应用程序的包 - 它是只读的。 – rmaddy

+1

@rmaddy:这不是主要的捆绑。我正在创建一个新的捆绑包。所以我们可以通过编码改变它。 – Chetan

回答

2

得到了答案..

此代码帮助。这用于从缓存刷新加载的捆绑包。

BOOL FlushBundleCache(NSBundle *prefBundle) { 
    // Before calling the function, we need to check if it exists 
    // since it was weak-linked. 
    if (_CFBundleFlushBundleCaches != NULL) { 
     NSLog(@"Flushing bundle cache with _CFBundleFlushBundleCaches"); 
     CFBundleRef cfBundle = 
     CFBundleCreate(nil, (CFURLRef)[prefBundle bundleURL]); 
     _CFBundleFlushBundleCaches(cfBundle); 
     CFRelease(cfBundle); 
     return YES; // Success 
    } 
    return NO; // Not available 
} 
+0

_CFBundleFlushBundleCaches是一个私有API。如果您尝试将其提交给App Store,您的应用将被Apple拒绝。 –

+1

@DavidCheung:谢谢大卫。是的,我后来发现。而我的应用程序被拒绝。我改变了使用bundle来使用静态NSDictionary的方法。这帮助了我。谢谢 – Chetan

+1

你能发表更完整的答案吗?谢谢。 –