小编sha*_*ght的帖子

定期后台同步

我对iOS编程很新,现在想要实现定期后台同步,以便将我的服务器数据与客户端数据同步.我想要实现的是与Androids相当的SyncAdapter,您可以在其中定义时间间隔(例如每30分钟),系统将在后台自动触发定义的任务.

到目前为止,我找不到Swift 3.0的这种机制,所以我需要问一下somone是否有经验或一些暗示我如何实现这一目标.

我想做的事听起来很简单:

当应用程序首次启动时,应用程序应设置同步管理器,该管理器每30分钟自动触发一次后台任务.后台任务负责同步服务器和客户端数据(使用Alamofire).

我怎样才能做到这一点?

background-process synchronisation ios swift3

7
推荐指数
1
解决办法
6131
查看次数

Linux上的URLSession给出了与iOS不同的结果

我有一个简单的类使用URLSession发送HTTP POST请求(到Neo4j服务器,但这没关系),以及测试它成功的集成测试.

通过Xcode,通过iOS模拟器,我可以运行这个测试一百万次 - 每次都成功.

但是,当我swift test在Ubuntu Linux上运行时(我使用IBM提供的docker镜像),我经常会遇到测试失败,说我收到了401响应.

通过容器中的cURL复制它根本不会失败,所以我不认为这是我的容器的问题.

我添加了一个数据包转储(我通过Charles Proxy检查),其中15个测试运行,7个测试运行(因此7个请求)失败.所有失败的请求都抱怨没有提供身份验证标头.从转储中,这是正确的,转储不包含那些失败的请求的身份验证标头.但为什么不呢?实际上,所有标头标志都是不同的:成功运行具有以下标头:

POST /db/data/cypher HTTP/1.1
Host: 192.168.0.18:7474
Accept-Encoding: deflate, gzip
Authorization: Basic bmVvNGo6c3RhY2swdmVyRmxvdw==
Content-Type: application/json; charset=utf-8
Accept: application/json; charset=utf-8
Connection: keep-alive
User-Agent: urlsessionTestPackageTests.xctest (unknown version) curl/7.35.0
Content-Length: 135
Run Code Online (Sandbox Code Playgroud)

而一个不成功的人有这些:

POST /db/data/cypher HTTP/1.1
Host: 192.168.0.18:7474
Accept: */*
Accept-Encoding: deflate, gzip
Connection: keep-alive
User-Agent: urlsessionTestPackageTests.xctest (unknown version) curl/7.35.0
Content-Length: 135
Run Code Online (Sandbox Code Playgroud)

所有200个结果都具有相同的标题,并且所有401结果具有相同的标题.你能在我的代码中看到任何应该保证这样随机请求的内容吗?

urlrequest server-side swift swift3

7
推荐指数
0
解决办法
571
查看次数

IMAP如何使用OAuth或OAuth2身份验证访问Yahoo Mail

根据developer.yahoo.com/mail/和IMAP回复:

* OK [CAPABILITY IMAP4rev1 ID MOVE NAMESPACE X-ID-ACLID UIDPLUS LITERAL+ CHILDREN XAPPLEPUSHSERVICE XYMHIGHESTMODSEQ AUTH=PLAIN AUTH=LOGIN AUTH=XOAUTH2 AUTH=XYMCOOKIE AUTH=XYMECOOKIE AUTH=XYMCOOKIEB64 AUTH=XYMPKI] IMAP4rev1 imapgate-1.8.1_01.20166 imap1009.mail.ne1.yahoo.com
Run Code Online (Sandbox Code Playgroud)

IMAP可以使用OAuth(2)身份验证访问Yahoo Mail.

我在https://developer.yahoo.com/apps/上注册了我的应用程序,因此我获得了客户端ID和客户端密钥.我没有找到任何与Mail相关的范围(API权限).不过,我选择了在注册我的应用程序时显示的所有API权限.

我试图实现OAuth和OAuth2.

OAuth2:我无法获取范围"mail-r"的授权码.当我生成URL(https://api.login.yahoo.com/oauth2/request_auth?client_id=CLIENT_ID&redirect_uri=oob&scope=mail-r&response_type=code)并在浏览器中打开它时,带有文本的页面"开发者:请从注册范围并再次提交." 被展示.它适用于其他范围.例如,我可以获取"sdct-r"的授权码

OAuth:我能够获得访问令牌.但是当我使用AUTHENTICATE XOAUTH2命令发送它时,我得到"NO [AUTHENTICATIONFAILED](#AUTH007)Bad scope"响应.

那么问题是应该设置哪些范围来使用IMAP和OAuth(2)访问Yahoo Mail?

imap oauth yahoo-mail oauth-2.0 yahoo-oauth

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

将NSPersistentStoreResult强制转换为数组

嗨,我遇到以下代码的问题.具体来说,if let语句将Cast转换NSPeristentStoreResult为不相关类型[Item]始终失败警告.我正在使用Swift 3.01.

看起来这应该很简单.我正在关注的这本书是使用早期版本的Swift编写的.谢谢你的放纵.

func demo(){

let request = NSFetchRequest<Item>(entityName: "Item")

  do {
     if let items = try CDHelper.shared.context.execute(request) as? [Item] {
        for item in items {
           if let name = item.name {
              print("Fetched Managed Object = '\(name)'")
           }
        }
     }
  } catch {
     print("Error executing a fetch request: \(error)")
  }
 }
Run Code Online (Sandbox Code Playgroud)

casting core-data ios swift swift3

6
推荐指数
1
解决办法
2247
查看次数

如何拆除核心数据堆栈?

我想为我的Core Data应用程序添加单元测试,但我确定如何重置测试之间的上下文.

这是我的CoreDataStack目标:

public final class CoreDataStack {
    var storeType: StoreType!
    public init(storeType: StoreType) {
        self.storeType = storeType
    }

    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "Transaction")
        container.loadPersistentStores(completionHandler: { (description, error) in
            if let error = error {
                fatalError("Unresolved error \(error), \(error.localizedDescription)")
            } else {
                description.type = self.storeType.type

            }
        })

        return container
    }()

    public var context: NSManagedObjectContext {
        return persistentContainer.viewContext
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我在测试中使用它的方式:

class PaymentTests: XCTestCase {

    var context: NSManagedObjectContext!

    override func setUp() {
        super.setUp() …
Run Code Online (Sandbox Code Playgroud)

core-data ios xctest swift swift3

6
推荐指数
2
解决办法
1151
查看次数

两个UIBezierPaths交集作为UIBezierPath

我有两个UIBezierPaths,一个代表图像部分的多边形,另一个是要在其上绘制的路径.

我需要找到它们之间的交点,以便只有该交叉区域内的点才会被着色.

有没有一种方法UIBezierPath可以在两条路径之间找到交叉点或新路径?

ios uibezierpath swift swift3

6
推荐指数
2
解决办法
2995
查看次数

查找对象数组的索引

我无法弄清楚如何在数组中找到对象的索引.例如,我有这个数据结构:

class Person {
var name: String
var age: Int

init(name personName: String, age personAge: Int) {
    self.name = personName
    self.age = personAge
  }
}

let person1 = Person(name: "person1", age: 34)
let person2 = Person(name: "person2", age: 30)
...
var personsArray = [person1, person2, ...]
Run Code Online (Sandbox Code Playgroud)

我尝试使用,personsArray.index(where: ....)但我不明白如何使用它.index(of: ...)不起作用.我认为因为personsArray不符合Equatable协议......

arrays ios swift

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

从基类扩展委托

我有一个objc基类:

@protocol BaseClassDelegate;

@interface BaseClass : NSObject

@property (nonatomic, weak) id <BaseClassDelegate> delegate;

@end

@protocol BaseClassDelegate <NSObject>

-(void)baseDelegateMethod;

@end
Run Code Online (Sandbox Code Playgroud)

我正在创建一个快速的子类,我想在其中扩展我的代理...

protocol SubClassDelegate : BaseClassDelegate {

    func additionalSubClassDelegateMethod();
}

class SubClass: BaseClass {

    @IBAction func onDoSomething(sender: AnyObject) {

        delegate?.additionalSubClassDelegateMethod();  <--- No such method in 'delegate'
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我创建我的子类时,我可以说它符合SubClassDelegate并设置委托.问题是(当然),这个子类中不存在'委托'.有没有办法告诉编译器将我的委托"扩展"到我的子类中?(或者我在这里疯了,错过了一些明显的东西)

delegates objective-c extend ios swift

5
推荐指数
2
解决办法
4596
查看次数

在super.init初始化self之前,在属性访问'frame'中使用'self'

我有这个代码

import UIKit

class CardView: UIView {

    @IBOutlet var imageView: UIImageView!

    init(imageView: UIImageView) {
        self.imageView = imageView
        super.init(frame: CGRect(x: 0, y:0, width: self.frame.size.width, height: self.frame.size.height))
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}
Run Code Online (Sandbox Code Playgroud)

我在行上收到错误:

super.init(frame: CGRect(x: 0, y:0, width: self.frame.size.width, height: self.frame.size.height))
Run Code Online (Sandbox Code Playgroud)

错误说 Use of 'self' in property access 'frame' before super.init initializes self

我不知道如何解决这个问题.

请记住,我来自客观 - C背景,最近开始学习迅捷.

ios swift swift3

5
推荐指数
1
解决办法
4584
查看次数

在哪里“设置 DISABLE_MANUAL_TARGET_ORDER_BUILD_WARNING”

我们有一个复杂的 Xcode 工作区,其中包含大量依赖项和依赖项的依赖项。构建它们的顺序很重要,Xcode <13 永远无法使用 Xcode 方案的“Parallelize Build”设置找出正确的顺序,因此这个选项对我们来说是无效的。

现在,在 Xcode 13 中,方案选项已更改为“依赖顺序”和“手动顺序”。由于上述原因,我们使用后者。

构建这个时,Xcode 会向我们发出以下警告:

不推荐以手动顺序构建目标 - 请在方案设置中选择“依赖顺序”,或在当前方案的任何目标中设置 DISABLE_MANUAL_TARGET_ORDER_BUILD_WARNING 以抑制此警告。

但我们找不到在哪里设置它。

问题:我们必须在 Xcode 中的哪个位置设置 DISABLE_MANUAL_TARGET_ORDER_BUILD_WARNING 来抑制此警告。

xcode xcode13

5
推荐指数
1
解决办法
4168
查看次数