小编epl*_*oko的帖子

如何异步同步CoreData和REST Web服务,同时将任何REST错误正确地传播到UI中

嘿,我正在为我们的应用程序模型层工作.

一些要求是这样的:

  1. 它应该适用于iPhone OS 3.0+.
  2. 我们的数据源是RESTful Rails应用程序.
  3. 我们应该使用Core Data在本地缓存数据.
  4. 客户端代码(我们的UI控制器)应该尽可能少地了解任何网络内容,并且应该使用Core Data API查询/更新模型.

我查看了关于构建服务器驱动的用户体验的WWDC10 Session 117,花了一些时间查看Objective Resource,Core ResourceRestfulCoreData框架.

Objective Resource框架本身不与Core Data对话,仅仅是一个REST客户端实现.Core Resource和RestfulCoreData都假设您在代码中与Core Data交谈,并且它们解决了模型层背景中的所有细节.

到目前为止所有看起来都没问题,最初我虽然核心资源或RestfulCoreData将涵盖所有上述要求,但是...有一些事情似乎没有一个正好解决:

  1. 保存服务器的本地更新时,不应阻止主线程.
  2. 如果保存操作失败,则应将错误传播到UI,并且不应将更改保存到本地Core Data存储.

当您调用- (BOOL)save:(NSError **)error托管对象上下文时,核心资源恰好向服务器发出所有请求,因此能够以某种方式向服务器提供正确的基础请求的NSError实例.但它会阻止调用线程,直到保存操作完成.失败.

RestfulCoreData保持您的-save:调用不变,并且不会为客户端线程引入任何额外的等待时间.它只是注意NSManagedObjectContextDidSaveNotification,然后在通知处理程序中向服务器发出相应的请求.但这种方式的-save:呼叫总是成功完成(当然,考虑到核心数据是好的,与保存的更改),并且实际调用它没有办法知道节省,可能也没有传播到因为一些服务器的客户端代码404421或任何发生服务器端错误.甚至更多,本地存储变得更新数据,但服务器永远不知道更改.失败.

所以,我正在寻找可能的解决方案/常见做法来处理所有这些问题:

  1. 我不希望调用线程-save:在网络请求发生时阻塞每次调用.
  2. 我想以某种方式在UI中收到某些同步操作出错的通知.
  3. 如果服务器请求失败,我希望实际的Core Data保存失败.

有任何想法吗?

iphone rest core-data objective-c

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

使用Authlogic和Authlogic OAuth插件创建隐式用户

我正在尝试在Rails中编写一个简单的OAuth消费者应用程序.我正在使用Authlogic来处理身份验证,使用Authlogic OAuth插件来执行oauth操作.

oauth插件提供了几个帮助来呈现登录按钮:oauth_login_button和oauth_register_button.与Authlogic逻辑和插件的请求过滤器一起,这两个按钮以某种方式创建会话/用户.

接下来发生的事情如下: - 如果我使用oauth_login_button助手,那么会话对象无法保存,因为本地没有这样的用户. - 如果我使用oauth_register_button助手,那么,在第一个之后的任何登录中,Rails会抱怨已经取得了令牌......这意味着它无法为同一个用户创建第二个副本,这是正确的.

问题是:我不想在我的网站上有两个注册和登录按钮.

在用户方面,我想要实现的是起始页面上的一个按钮,说smth.例如"使用Twitter登录",用户必须单击该页面以进入网站的内部页面.

在服务器端,如果用户是我网站的第一次访问者,我想隐式创建本地用户帐户.

关于如何做到这一点的任何提示?

Authlogic + OAuth上的所有样本我都能找到,似乎并不关心只有一个按钮可以登录.:(

ruby ruby-on-rails oauth authlogic

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

数据源属性不会从试剂传播到React Native ListView组件的render方法

我正在尝试在试剂中呈现React Native ListView.

我有以下代码段:

(def data-source
 (React.ListView.DataSource. #js{:rowHasChanged (fn [a b] false)}))

(defn render-row []
  [ui/view])

(def rows
  (clj->js ["whoa", "hey"]))

(defn main-scene []
  (fn []
    [ui/list-view {:render-row render-row
                   :data-source (.cloneWithRows data-source rows)}]))
Run Code Online (Sandbox Code Playgroud)

上面导致"失败的propType:dataSource未指定所需的prop ListView.检查渲染方法app.ios.ui.main_scene." 接下来是"无法读取未定义的属性'rowIdentities',因为数据源在ListView的render方法中未定义.

我的第一个猜测是在试剂/打嗝或其他任何东西的某个地方对某些"数据"属性进行了一些特殊处理,但我找不到为什么该属性没有正确传播的单一线索.

而且,是的,(.cloneWithRows data-source rows)实际上返回一个有效的ListViewDataSource对象实例.

然后,如果我通过:data-source,:dataSource我得到的是一个令人费解的"StaticRenderer.render():必须返回一个有效的ReactComponent.你可能已经返回了undefined,一个数组或一些其他无效对象."

我使用react-native 0.18.1reagent 0.5.1re-frame 0.6.0.我曾与选中此reagent 0.6.0-alphare-frame 0.7.0-alpha,得到了相同的错误.

我一直在挖这个几个小时,我想我需要一些帮助.尝试修复此问题的任何提示/想法,代码中的任何引用都要查看?非常感谢提前.

hiccup clojurescript reagent react-native re-frame

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

如何将列表传递给clojure的` - >`宏?

我正在尝试找到一种通过函数列表来线程化值的方法.

首先,我有一个通常的基于铃声的代码:

(defn make-handler [routes]
  (-> routes
      (wrap-json-body)
      (wrap-cors)
      ;; and so on
      ))
Run Code Online (Sandbox Code Playgroud)

但这不是最优的,因为我想编写一个测试来检查路由实际上是用wrap-cors包裹的.我决定将包装器解压缩成def.所以代码变成如下:

(def middleware
  (list ('wrap-json-body)
        ('wrap-cors)
        ;; and so on
        ))

(defn make-handler [routes]
  (-> routes middleware))
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,并不应该因为->宏没有将列表作为第二个参数.所以我尝试使用该apply函数来解决这个问题:

(defn make-handler [routes]
  (apply -> routes middleware))
Run Code Online (Sandbox Code Playgroud)

最终拯救了:

CompilerException java.lang.RuntimeException:无法获取宏的值:#'clojure.core/ - >

所以问题就出现了:如何将一个值列表传递给->宏(或者说,任何其他宏),就像apply对函数一样?

macros list clojure apply

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