小编joh*_*ham的帖子

Cocoapods将框架导入源代码

在我的iOS的cocoapod中,我有一个基本上的项目:

  1. 开源类(.m和.h文件)
  2. MyFramework.framework(.framework目录,头文件和资源的.bundle)

其中一个开源类调用,import <MyFramework.MyFramework.h>因此它可以在其实现中使用MyFramework的组件.但正因为如此,我无法让podspec通过规范lint测试(pod spec lint MyCocoapod.podspec).当我运行spec lint验证时,它说:

ERROR | [iOS] [xcodebuild] .../MyFile.h:54:9: fatal error: 'MyFramework/MyFramework.h' file not found

在调查时,我注意到podspec确实通过了规范lint验证,如果我删除podspec的source_files部分中的那个开源类,s.source_files = 'MyFiles.{h,m}'.知道为什么我的类在规范lint验证期间无法导入我的自定义框架?

podspec中的相关代码如下所示:

s.preserve_paths      = 'myframework/MyFramework.framework'
s.frameworks          = 'Foundation', 'MyFramework'
s.xcconfig            = { 'FRAMEWORK_SEARCH_PATHS' => '$(SRCROOT)/myframework/' }
s.public_header_files = 'MyFramework.framework/Headers/*.h', 'SourceCode/*.h'
s.source_files        = 'SourceCode/*.{h,m}'  # Crashes here - Source_file imports MyFramework.h. If I take this out, it passes spec lint validation
Run Code Online (Sandbox Code Playgroud)

xcode frameworks objective-c ios cocoapods

18
推荐指数
2
解决办法
1万
查看次数

在编译时检查框架是否存在?

我正在开发一个可以选择使用闭源框架的开源项目.如果闭源框架包含在项目中,则会有其他功能.但是,如果框架未包含在项目中,则项目仍应正确编译.

如果框架包含在项目中,如何在编译时检查

基本上,我想做这样的事情:

#ifdef _MY_FRAMEWORK_EXISTS
#import <MyFramework/MyFramework.h>
#endif
Run Code Online (Sandbox Code Playgroud)

我已经看过2年前的老问题,就像这个问题一样,但没有答案浮出水面,所以我现在可能会遗漏一些新东西.

我不想在运行时通过检查NSClassFromString(),因为当我尝试导入时它将在编译时失败MyFramework并且它不存在.

frameworks objective-c compile-time ios

17
推荐指数
1
解决办法
5067
查看次数

什么是减少objective-c中静态库大小的最佳实践?

在构建一个objective-c静态库时,我注意到.a文件(来自模拟器和iPhone的胖文件)非常大.特别是,它最初是5.7mb.我发现这篇文章并将我的构建设置设置Generate Debug Symbols为No,将lib大小减小到1.7mb.

这是一个很大的改进,但还有什么可以做的吗?实现和头文件单独占用~100kb.

xcode objective-c static-libraries ios

14
推荐指数
1
解决办法
4691
查看次数

从Objective-c中的.bundle加载png时出错

我正在我的Xcode项目中构建一个框架.为了构建框架,我创建了一个聚合目标.该框架由静态库,头文件和.png资产包组成MyFrameworkResources.bundle.当我构建聚合时,一切都已成功创建,并且bundle存在于Products目录中.

我的Xcode项目中还有一个目标应用程序.此应用程序用于测试框架产品(静态库,头文件和包).我已经添加了静态库和MyFrameworkResources.bundle目标应用程序的目标依赖项.我还在MyFrameworkResources.bundle目标应用程序的Build Phases中添加了Copy Bundle Resources.

我可以使用静态库中的所有文件,但是在尝试从bundle中加载资源时出现错误.这就是我从捆绑中加载资产的方式:

NSString *mainBundlePath = [[NSBundle mainBundle] resourcePath];
NSString *frameworkBundlePath = [mainBundlePath stringByAppendingPathComponent:@"MyFrameworkResources.bundle"];
NSBundle *frameworkBundle = [NSBundle bundleWithPath:frameworkBundlePath];
NSLog(@"bundle: %@", frameworkBundle);

NSError *error;
[frameworkBundle loadAndReturnError:&error]; // <-- THIS RETURNS AN ERROR
NSLog(@"error: %@", error);
UIImage *image = [UIImage imageWithContentsOfFile:[frameworkBundle pathForResource:@"AnyImage" ofType:@"tiff"]]; // <-- EDIT, USE "tiff", NOT "png"
Run Code Online (Sandbox Code Playgroud)

当我记录捆绑包时,我得到了这个:

bundle: NSBundle/Users/my_comp/Library/Application Support/iPhone Simulator/6.1/Applications/blah-blah-blah/MyApp.app/MyFrameworkResources.bundle(尚未加载)

当我记录错误时,我得到了这个:

错误: 错误Domain = NSCocoaErrorDomain Code = 4"无法加载捆绑包"MyFrameworkResources",因为无法找到其可执行文件." UserInfo = 0x7535ee0 {NSLocalizedRecoverySuggestion =尝试重新安装捆绑包.,NSLocalizedFailureReason =无法找到捆绑包的可执行文件.,NSLocalizedDescription =无法加载捆绑包"MyFrameworkResources",因为无法找到其可执行文件.,NSBundlePath =/Users/my_comp/Library/Application Support/iPhone …

xcode png bundle objective-c ios

4
推荐指数
1
解决办法
2035
查看次数

主线程上的NSFetchedResultsController忽略从另一个线程保存到Core Data?

我有一个NSFetchedResultsController主线程.同样从主线程,我异步发送JSON的网络请求.当JSON字符串返回时,我启动NSOperation一个新的(后台)NSManagedObjectContext,解析JSON字符串,创建/更新NSManagedObject,并将它们保存在上下文中.后台上下文与主上下文具有相同的persistentStore.有了这个,我有两个问题:

  1. 我认为从任何上下文(在任何线程上)对持久性存储的任何保存都会通知主要NSFetchedResultsController有变化,但到目前为止它没有发现任何变化.我应该做些什么来通知主线程NSFetchedResultsController有外部save的,以便相应的tableView更新?

  2. 因此,在主线程上,我订阅NSManagedObjectContextWillSaveNotification并正确查看所有上下文(包括完全在单独线程上存在的上下文)何时执行save操作.的苹果文档说的是notification.userInfo具有应3个阵列,一个阵列的每个在后台线程的"更新,删除和插入的"模型对象的字典.但是,这对我userInfo来说总是如此nil.我有什么想法我做错了吗?

订阅NSManagedObjectContextWillSaveNotificationAppDelegate:

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(managedObjectContextDidSave:)
                                             name:NSManagedObjectContextWillSaveNotification 
                                           object:nil];
Run Code Online (Sandbox Code Playgroud)

以及在AppDelegate中保存上下文的方法:

- (void)managedObjectContextDidSave:(NSNotification *)notification {
    DLog(@"notification: %@", notification); //not nil
    DLog(@"notification user info: %@", notification.userInfo); // always nil... why??

    NSManagedObjectContext *theContext = notification.object;
    if(theContext != context) {
        DLog(@"---- SAVED ON ANOTHER CONTEXT");

        // should I notify NSFetchedResultsController that there were …
Run Code Online (Sandbox Code Playgroud)

multithreading core-data nsfetchedresultscontroller nsoperationqueue nsmanagedobjectcontext

3
推荐指数
1
解决办法
1338
查看次数