我是iPhone开发的新手,并且通过GCD概念进行多线程处理.
'dispatch_queue_t'创建了一个串行队列,我已经读过一个串行队列一次只能执行一个作业.GCD旨在同时执行多个任务,然后为什么串行队列存在?
例如,我想做2个任务.任务A和任务B.我创建一个串行队列来执行这两个任务.我在主队列中这样做.这是我正在做的代码:
dispatch_queue_t my_serial_queue = dispatch_queue_create("queue_identifier", 0);
dispatch_sync(my_serial_queue, ^{
NSLog(@"Task 1");
});
dispatch_sync(my_serial_queue, ^{
NSLog(@"Task 2");
});
Run Code Online (Sandbox Code Playgroud)
现在,根据规则,任务将串行执行,因为它是串行队列,即首先执行任务A,然后在任务A完成后,将执行任务B. 而且它在日志中给我相同的输出.
所以,我的问题是,如果我想同时执行这两项任务怎么办?如果这个问题的答案是为任务B创建另一个串行队列,那么代码的结构应该是这样的:
dispatch_queue_t my_serial_queue_1 = dispatch_queue_create("queue_identifier_1", 0);
dispatch_queue_t my_serial_queue_2 = dispatch_queue_create("queue_identifier_2", 0);
dispatch_sync(my_serial_queue_1, ^{
NSLog(@"Task 1");
});
dispatch_sync(my_serial_queue_2, ^{
NSLog(@"Task 2");
});
Run Code Online (Sandbox Code Playgroud)
我得到了相同的输出.原因是我使用'dispatch_sync'调用而不是'dispatch_async'调用.但是当我在不同的队列中运行这两个任务时,它们不应该同时执行吗?如果没有,那么我们为什么要创建一个不同的队列呢?我可能通过'dispatch_async'调用使用相同的队列来同时执行这两个任务.
我真的需要回答这个问题,因为在将来设计我的多任务应用程序的结构之前,它会更好地指导我.
multithreading multitasking nsthread grand-central-dispatch ios
我的目标是根据他/她的Twitter帐户获取用户的详细信息.首先,让我解释一下我想做什么.
在我的情况下,将向用户显示使用Twitter帐户注册的选项.因此,基于用户的Twitter帐户,我希望能够获取用户详细信息(例如电子邮件ID,姓名,个人资料图片,出生日期,性别等)并将这些详细信息保存在数据库中.现在,很多人可能会建议我使用ACAccount和ACAccountStore一个提供访问,操作和存储帐户的界面的类.但在我的情况下,即使用户尚未在iOS设置应用中为Twitter配置帐户,我也想要注册用户.我希望用户导航到Twitter的登录屏幕(在Safari或App本身,或使用任何其他替代方案).
我也提到Twitter的API有列表的文档在这里.但我很困惑应该如何向用户提供登录屏幕以登录Twitter帐户以及如何获取个人资料信息.我应该使用UIWebView,还是将用户重定向到Safari或采用其他方式?
我一直在研究 iOS 9 功能并了解App Thinning的概念。
我从苹果的应用程序切片(应用程序细化的一部分)文档中读到:
切片是为不同目标设备创建和交付应用程序包变体的过程。变体仅包含目标设备所需的可执行体系结构和资源。您继续开发应用程序的完整版本并将其上传到 iTunes Connect。商店将根据您的应用支持的设备创建并提供不同的变体。图像资源根据其分辨率和设备系列进行切片。
因此,基于此,我可以理解,如果我将图像定义为@1x @2x @3x,那么如果用户拥有 iPhone 6 plus,则只会下载 @3x 图像。但其他资源呢?
我需要编写任何代码吗App slicing?除了图像之外,还有哪些其他方式可以使应用程序瘦身受益?
我iOS dark mode在我的 iPad 应用程序中提供支持。当品牌徽标图像为黑色时,此问题仅适用于暗模式。一般来说,所有品牌标志都不是白色的,所以光模式没有问题。
以下是两种模式的屏幕截图:
浅色模式下的 Adura 品牌标志
深色模式下的 Adura 品牌标志
我怎样才能容纳这样的标志?我几乎没有建议将徽标后面的背景视图设置为灰色,但同样,某些品牌可能会出现灰色徽标。
如何设置残留在人物UILabel的UITextView?
我已经为UITextField,但同样的代码不起作用..
这是我尝试过的:
func textView(textView: UITextView, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
if string == ""
{
if plainTextView.text!.characters.count == 0
{
charCount = 0
countLabel.text = String(format: "%i Characters Left", maxLength - charCount)
return false
}
charCount = (plainTextView.text!.characters.count - 1)
countLabel.text = String(format: "%i Characters Left", maxLength - charCount)
return true
}
else
{
charCount = (plainTextView.text!.characters.count + 1)
countLabel.text = String(format: "%i Characters Left", maxLength - charCount)
if …Run Code Online (Sandbox Code Playgroud) 为了同时执行两个任务,我创建了两个并发队列,并将一些块分派给两个队列.
这是我在主线程中所做的
-(IBAction)btn_Pressed:(id)sender
{
dispatch_queue_t queue_a = dispatch_queue_create("com.gcd_demoA", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue_b = dispatch_queue_create("com.gcd_demoB", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue_a, ^{
NSLog(@"A - 1");
});
dispatch_sync(queue_a, ^{
NSLog(@"A - 2");
});
dispatch_sync(queue_a, ^{
NSLog(@"A - 3");
});
dispatch_sync(queue_b, ^{
NSLog(@"B - 1");
});
dispatch_sync(queue_b, ^{
NSLog(@"B - 2");
});
dispatch_sync(queue_b, ^{
NSLog(@"B - 3");
});
}
Run Code Online (Sandbox Code Playgroud)
但是,令人惊讶的是我总是得到以下输出:
A - 1
A - 2
A - 3
B - 1
B - 2
B - 3
Run Code Online (Sandbox Code Playgroud)
这是Apple文档所说的(参考):
提交到串行队列的块按FIFO顺序一次执行一个.但是,请注意,提交给独立队列的块可以相互同时执行.提交到并发队列的块以FIFO顺序出列,但如果有资源可以同时运行.
所以,根据这个语句,在我的情况下,无论队列A中发生了什么,队列B的块都应该执行.意思是,完全独立于队列A.但是,为什么队列B的块不会开始执行直到所有队列A完成.
如果某些事情被误解,请纠正我.
concurrency multithreading multitasking grand-central-dispatch ios
我见过 2 个属性AVPlayerItem:
@property (nonatomic, readonly, getter=isPlaybackBufferFull) BOOL playbackBufferFull;
@property (nonatomic, readonly, getter=isPlaybackBufferEmpty) BOOL playbackBufferEmpty;
Run Code Online (Sandbox Code Playgroud)
现在,这是Apple文档所说的:
回放缓冲区满:
此属性报告用于播放的数据缓冲区已达到容量。尽管播放缓冲区已达到容量,但可能不存在足够的统计数据来支持 的
playbackLikelyToKeepUp预测YES。
回放缓冲区空:
它表示播放已消耗所有缓冲媒体,播放将停止或结束。
从这些陈述中,我的理解是:
回放缓冲区满:
整个数据已加载播放。例如,我正在从 URL 播放 5 分钟长的视频。当直到最后的所有内容都已加载时,这些将是正确的。
回放缓冲区空:
实际播放已经消耗了到目前为止加载的所有缓冲区。例如,直到 2.3 分钟的数据已经被加载并且播放也已经到了那个时间并且没有更多的内容可以呈现。(我认为是时候开始我们的旋转木马了,一个指标)
我误解了什么吗?如果是,请纠正我..
欢迎任何深入的知识或建议!
我想在iOS中使用salt生成SHA512.我找到了以下代码片段来实现这一点,但我发现该CCHmac()功能适用于mac.
-(NSString *)hashString:(NSString *)data withSalt:(NSString *)salt
{
const char *cKey = [salt cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSString *hash;
NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", cHMAC[i]];
hash = output;
return hash;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用CC_SHA512()函数,那么我将如何使用salt字符串?
以下是我的字典数组,我希望得到一个基于特定键的字符串数组(contentURL在我的情况下是键).
我怎样才能实现它?我曾经碰到Reduce&Filter但没有一个适合我的要求.
(
{
contentURL = "https://d1shcqlf263trc.cloudfront.net/1510232473240ab.mp4";
},
{
contentURL = "https://d1shcqlf263trc.cloudfront.net/151021804847312.mp4";
},
{
contentURL = "https://d1shcqlf263trc.cloudfront.net/151021536556612.mp4";
},
{
contentURL = "https://d1shcqlf263trc.cloudfront.net/151021528690312.mp4";
}
)
Run Code Online (Sandbox Code Playgroud)
预期产出
[
"https://d1shcqlf263trc.cloudfront.net/1510232473240ab.mp4",
"https://d1shcqlf263trc.cloudfront.net/151021804847312.mp4",
"https://d1shcqlf263trc.cloudfront.net/151021536556612.mp4",
"https://d1shcqlf263trc.cloudfront.net/151021528690312.mp4"
]
Run Code Online (Sandbox Code Playgroud) ios ×9
swift ×4
multitasking ×2
app-thinning ×1
avplayer ×1
avplayeritem ×1
commoncrypto ×1
concurrency ×1
ios-darkmode ×1
ios9 ×1
nsthread ×1
objective-c ×1
swift4.2 ×1
twitter ×1
uitextview ×1
uiview ×1