我想在Objective-C Xcode项目中使用C库.
库目录结构如下:
-- include/
|-- config.h
|-- lib/
| |-- file1.h
| |-- file2.h
| |-- file3.h
Run Code Online (Sandbox Code Playgroud)
该库的文档说包含file1.h,file1.h包括file2.h和file3.h.
我收到file2.h和file3.h`的包含"文件未找到"错误.file1.h以下列方式包含它们:
#include <lib/file1.h>
#include <lib/file2.h>
Run Code Online (Sandbox Code Playgroud)
我在这里读到这些尖括号指示预处理器沿着INCLUDE环境变量指定的路径搜索包含文件,而不是在与包含#include的文件相同的目录中进行搜索.
所以我通过转到Product-> Edit Scheme ..在Xcode中添加了INCLUDE环境变量,然后将其设置为/the-whole-path-to/include/,我仍然得到文件未找到错误.
如果我更改file1.h以包含它们,则成功包含文件:
#include "file2.h"
Run Code Online (Sandbox Code Playgroud)
但是我不想为库中的每个文件都这样做.
我怎样才能解决这个问题?
在Firestore中,如何在不为每个键创建索引的情况下执行涉及地图中的键的复合查询?
例如,考虑一个包含博客帖子的集合,每个博客帖子都有类别.
Post {
title: ..
...
categories: {
cats: true
puppies: true
}
}
Run Code Online (Sandbox Code Playgroud)
为了以分页方式查询特定类别中的帖子,我们将执行以下操作:
let query = db.collection(`/posts`)
.where(`categories.${categoryId}`, '==', true)
.orderBy('createdAt')
.startAfter(lastDate)
.limit(5);
Run Code Online (Sandbox Code Playgroud)
但似乎这需要每个类别的综合索引(categories.<categoryId>和createdAt).有没有办法解决?
就我而言,为每个类别创建复合索引是不可行的,因为类别是用户生成的,并且可能很容易超过200(Firestore中复合索引的限制).
如何将CMSampleBufferRef转换为NSData?
我已经设法MPMediaItem通过跟踪Erik Aigner在这个线程上的答案来获取数据,但数据是类型的CMSampleBufferRef.
我知道CMSampleBufferRef是一个结构,在iOS Dev Library 的CMSampleBuffer Reference中定义,但我不认为我完全理解它是什么.CMSampleBuffer函数似乎都不是一个明显的解决方案.
如何从Swift脚本调用外部命令(启动子进程)?
也许就像call(["ls", "-l"])在Python中一样.
我有一个可以构建并运行良好的iOS项目,但是"Clean Build Folder ..."选项被禁用.事实上,它在我的所有项目中都被禁用(所有iOS,一些在工作区中).
它们尚未从此线程中讨论的先前Xcode版本升级.

要查看Clean Build Folder...选项,请在查看"产品"菜单时按住选项键.
我该怎么做才能启用它?
差不多一年之后.目前在Xcode 6.3上.仍然没有运气.
如果我想,我将如何创建像MyWi这样的应用程序,即wifi网络共享应用程序?实现此功能的步骤是什么?我需要使用哪些框架/库?
我们的目标不是试图将此应用程序引入应用程序商店,而是将其用于个人用途,并将其提供给其他人.
编辑:尼克指出HandyLight应用程序,一个伪装成手电筒提供网络共享功能的应用程序.因此,可以通过非越狱手机上的第三方应用程序提供网络共享功能.那怎么办?
对于我的研究,我有点死路一条:(
我一直在从各种示例代码和经典的Unix网络编程教科书中学习插座和网络编程,同时尝试将这些知识用于我正在开发的应用程序中.我目前正在处理应用程序的一部分,需要简单的客户端 - 服务器设置.
这是现在的情况(好吧,它应该如何):
NSNetService并使用创建套接字CFSocketCreateWithNative()NSNetServiceBrowserMyConnection)实例来处理连接.用于获得连接的读写流CFStreamCreatePairWithSocket().当我尝试让服务器将数据发送回客户端时,我收到"正在进行操作"错误,如下面的连接代码中所示.我相信这是因为NSOutputStream没有空间.处理这个问题的最佳方法是什么?我知道它应该等待NSStreamEventHasSpaceAvailable事件,但它似乎没有发生......
编辑:呃......当我收到这个错误时,我只用iPhone模拟器测试应用程序,并让它充当服务器和客户端,因为我的新公寓还没有互联网:P使用两个真实设备时似乎没有问题.
是否可以制作此服务器,以便从每个连接对象发送和接收数据不会阻止从其他连接对象发送和接收数据?每个新的连接对象是否需要在新的runloop或线程或类似的东西上?我已经围绕苹果并发文档进行了捕获,但没有任何内容正在跳出......目标是尽可能快地将响应发送给客户端,无论有多少其他客户端连接到服务器.
更新:除了允许并发连接到此服务器之外,我正在考虑将连接排队并一次处理一个,因为需要发送到每个客户端的数据量非常小.这是最好的决定吗?如果队列中有数百个客户端怎么办?第二个想法,这可能是一个坏主意,因为在快速的本地网络上建立连接需要一两秒,并且需要更长时间才能使用蓝牙...我会喜欢这方面的专家建议:)
注意:APNetService和APNetServiceBrowser类似于NSNetService和NSNetServiceBrowser
- (void) startServerForGroup:(NSString *)name
{
self.groupName = name;
NSInteger port = [self prepareListeningSocket];
self.service = [[APNetService alloc] initWithDomain:@"local."
type:@"_example._tcp."
name:self.groupName
port:port];
self.service.delegate = self;
[self.service publish];
}
- (NSInteger) prepareListeningSocket
{
int listenfd, err, junk, port;
BOOL success;
struct sockaddr_in addr;
port = 0;
listenfd = …Run Code Online (Sandbox Code Playgroud) 在Xcode 11之前,您可以使用cmd+shift+o打开快速打开菜单,然后使用opt+shift+enter显示小跳转对话框来确定在何处打开文件,例如
请注意,对话框中有一些要在新窗口或新选项卡中打开的位置。
在XCode 11中,对所有编辑器进行了改进(这些功能很棒),小跳转对话框已替换为当前窗口中显示的一些蓝色突出显示。这看起来不错,但是我不知道如何在新标签页或新窗口中打开文件。
直到它消失了,我才意识到这在我的工作流程中有多重要:)
好的,所以我整天都在这个bug,我想我已经把它缩小到了根本问题.
我正在开发一个应用程序,它要求我编写自己的版本,NSNetService并NSNetServiceBrowser允许在iOS 5中通过蓝牙使用Bonjour.这是一次伟大的冒险,因为在我开始这个项目之前我对网络编程一无所知.我从各种示例项目和经典的Unix网络编程教科书中学到了很多东西.我的实现主要基于Apple的DNSSDObjects示例项目.我已经添加了代码,以便在服务解决后实际建立设备之间的连接.一个NSInputStream和一个NSOutputStream是通过CFStreamCreatePairWithSocketToHost( ... ).
我试图通过此连接发送一些数据.数据由一个整数,一些NSStrings和一个NSData存档的对象组成NSKeyedArchiver.大小NSData约为150kb,因此整个消息的大小约为160kb.通过连接发送数据后,当我尝试取消归档时,我收到以下异常...
Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive
Run Code Online (Sandbox Code Playgroud)
经过进一步探索后,我注意到收到的数据只有2kb左右.消息被截断,从而使归档"难以理解".
将数据发送到所有连接设备的方法
- (void) sendMessageToPeers:(MyMessage *)msg
{
NSEnumerator *e = [self.peers objectEnumerator];
//MyMessage conforms to NSCoding, messageAsData getter calls encodeWithCoder:
NSData *data = msg.messageAsData;
Peer *peer;
while (peer = [e nextObject]) {
if (![peer sendData:data]) { …Run Code Online (Sandbox Code Playgroud)