我想每个实例只运行一次代码块.
我可以将dispatch_once_t谓词声明为成员变量而不是静态变量吗?
从GCD参考资料中,我不清楚.
谓词必须指向存储在全局或静态范围内的变量.使用具有自动或动态存储的谓词的结果是未定义的.
我知道我可以使用dispatch_semaphore_t和一个布尔标志来做同样的事情.我只是好奇.
我已经像这样创建了一个GCD队列:
dispatch_queue_t q = dispatch_queue_create("com.testcompany.myqueue", NULL);
Run Code Online (Sandbox Code Playgroud)
当我将任务分派给该队列时,它比在主线程上执行任务要慢.
dispatch_async(q, ^(void) {
[self performHeavyCalculationAndUpdateUI];
});
Run Code Online (Sandbox Code Playgroud)
我怀疑默认情况下队列的优先级非常低.如何更改此队列的优先级?或者还有什么我必须做的吗?
当我将textField的inputView设置为我的KeyboardView时,我有一个自定义键盘,可以显示某个UITextField.键盘效果非常好,但很明显,如果用户之前已取消内置的Apple键盘或拆分它,键盘将"浮动".
我已经搜索了很多小时的方法,以确保我的自定义键盘不会像这样,而是停留在屏幕的底部,无论用户之前是否已取消内置的Apple键盘.
self.keyboardInputView = [[[KeyboardInputViewController_iPad alloc]
initWithNibName:@"KeyboardInputViewController_iPad"
bundle:[NSBundle mainBundle]] autorelease];
self.keyboardInputView.delegate = self;
self.keyboardInputView.keyboardTextField = myTextField;
myTextField.inputView = self.keyboardInputView.view;
[myTextField becomeFirstResponder];
Run Code Online (Sandbox Code Playgroud) 鉴于此协议定义:
@protocol MyProtocol <NSObject>
@property (nonatomic, strong) NSString *someProperty;
@end
Run Code Online (Sandbox Code Playgroud)
为什么Xcode很乐意为此声明提供自动完成功能:
id<MyProtocol> thing = [ThingManager currentThing];
[thing someProperty]; // Xcode offered autocompletion here
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用点符号访问相同的属性时,它不提供自动完成功能:
id<MyProtocol> thing = [ThingManager currentThing];
thing.someProperty; // Xcode claimed there were
// "No completions" available
// after the period
Run Code Online (Sandbox Code Playgroud) 我想在使用WKWebView的iOS应用程序中支持第三方cookie.当用户在Safari的设置中阻止所有cookie时,有没有办法支持第三方cookie(设置 - > Safari - >阻止Cookie - >始终)?
我已经尝试从响应中保存所有cookie并在请求中发送它们但它没有帮助.
我的应用程序大量使用GCD,几乎所有内容都分散在由调度处理的小任务中.但是,基础数据模型主要是读取的,只是偶尔写入.
我目前使用锁来防止在阅读时更改关键数据结构.但是在今天看了一些锁之后,我发现了NSConditionLock和一些关于读写锁的页面.后者正是我所需要的.
我找到了这个实现:http://cocoaheads.byu.edu/wiki/locks.我的问题是,这个实现是否适用于GCD,看到它使用PThreads?
iphone multithreading locking objective-c grand-central-dispatch
使用Grand Central Dispatch,您可以安排读取和写入,而无需担心何时/如何发生这种情况.与我之前基于NSStream的方法相比,这需要更少的外部管理.但是,我的天真实现比基于NSStream的方法慢.
对于NSStream,我查询了源和目标(NSURLPreferredIOBlockSizeKey
)的首选IO大小.然后我将整个"首选输入大小的块"读入缓冲区,并且只要我在缓冲区中至少有"首选输出大小"字节,我就会将整个块写入目标(当然除了最后一个块).在读写性能方面,这应该非常接近最佳值.
但是,对于GCD,我对此没有多大影响.想象一下,源的首选IO大小为100kB,并且目标的首选IO大小为1MB:我的天真实现现在写入的次数是基于NSStream的解决方案的10倍.
那么,用GCD解决这个问题最有效的方法是什么?只需写入读取器块中的缓冲区,一旦收集到足够的数据,就可以调度"首选输出大小"的写入块?我想GCD可能会在这里为我提供一个我还没有意识到的解决方案.
这是我目前GCD解决方案中最重要的部分:
// input_ and output_ are of type dispatch_io_t
dispatch_io_read(
input_,
0,
SIZE_MAX,
dispatch_get_main_queue(),
^(bool done, dispatch_data_t data, int error) {
size_t data_size;
if (error) {
NSLog(@"Input: error %d", error);
[self cancel];
return;
}
if (data) {
data_size = dispatch_data_get_size(data);
if (data_size > 0) {
dispatch_io_write(
output_,
0,
data,
dispatch_get_main_queue(), ^(bool done, dispatch_data_t data, int error) {
// TODO: I don't know how to get the offset (for progress). So I need …
Run Code Online (Sandbox Code Playgroud) 这是一个比错误相关的问题更开放的问题,所以如果你不喜欢回答这些问题,请不要火焰.
我在.csv文件中有一个巨大的(!)船只列表,用.分隔 ,
矩阵的组织方式如下:
用不同的数据重复约500次.
现在,我希望将其读入对象,可以进一步用于填充UITableView
当前,我将数据硬编码到目标文件中,就像这样
arrayWithObjectsForTableView = [[NSMutableArray alloc] init];
if ([boatsFromOwner isEqualToString:@"Owner1"]) {
cargoShips* ship = [[cargoShips alloc]init];
ship.name = @"name1";
ship.size = 1000;
ship.owner = @"Owner1";
[self.boatsForOwner addObject:ship];
ship = [[cargoShips alloc]init];
ship.name = @"Name 2";
ship.size = 2000;
ship.owner = @"Owner2";
Run Code Online (Sandbox Code Playgroud)
if-else的依此类推.这是一个糟糕的方法,因为1)它很无聊并需要很长时间2)如果我想更新信息需要更多时间.所以,我认为从矩阵中以编程方式读取而不是自己做它会更聪明.是的,船长显然是为了访问我的大脑.
那么,对于这个问题!
如何读取如下所示的.csv文件:
NSMutableArray
以对象的形状将
所有者的船只添加到a 中.(所以他们可以用来喂我UITableView
的船.
我还想选择按照不同的东西进行排序,例如构建国家,运营商等.如何将从.csv读取的相关船只的代码编写到对象中?我不太了解编程,因此非常感谢深入的答案.
如何在使用Realm检索数据时返回带有值的类?我正在尝试使用此代码,但不允许使用swift 3:
static func getInfoById(id: String) -> DataInfo {
let scope = DataInfo ()
let realm = try! Realm()
scope = realm.objects(DataInfo.self).filter("IdInfo == %@", id)
return scope
}
Run Code Online (Sandbox Code Playgroud) 我使用以下行在我的Swift应用程序中打开外部URL:
UIApplication.sharedApplication().openURL(url)
Run Code Online (Sandbox Code Playgroud)
这很好用,直到我通过CocoaPods将Realm添加到我的项目中.那时,它开始给我下面的两个编译错误:
'sharedApplication()'不可用:在适当的情况下使用基于视图控制器的解决方案.
'openURL'不可用
这些错误表明API不适用于Application Extensions,但我的代码是在正常的应用程序中,而不是扩展.为什么添加Realm会导致编译器认为它在App扩展中?